目录
- 题目描述:
- 输入:
- 输出:
- 代码实现:
题目描述:
给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。
输入:
head = [1,2,3,3,4,4,5]
输出:
[1,2,5]
代码实现:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode deleteDuplicates(ListNode head) {
if (head == null) {// 链表为空的情况
return null;
}
// 创建一个哑结点,指向链表的头节点:方便后续删除操作
ListNode temp = new ListNode(0, head);
ListNode cur = temp;// 创建遍历链表使用的指针cur
while (cur.next != null && cur.next.next != null) {// 保证连续两个后继都不为空
if (cur.next.val == cur.next.next.val) {// 当出现重复元素时
int x = cur.next.val;// 记录重复元素的值val
while (cur.next != null && cur.next.val == x) {
// 从当前cur指向的结点开始,循环删除所有val为x的节点
cur.next = cur.next.next;// cur指向其后继的后继
}
} else {
// 未出现重复元素时,正常往后遍历链表
cur = cur.next;
}
}
return temp.next;// 返回哑节点的后继
}
}