82. 删除排序链表中的重复元素 II
解题思路
-
创建哑结点(Dummy Node):首先,代码创建了一个哑结点(dummyNode),并将其next指针指向链表的头节点head。这个哑结点是为了简化边界条件处理,特别是头节点可能被删除的情况。
-
遍历链表:接下来,代码使用一个cur指针从哑结点开始遍历链表。在遍历过程中,检查cur的下一个节点cur.next和下下一个节点cur.next.next的值是否相等,以此判断是否存在重复元素。
-
删除重复元素:如果发现重复元素(即cur.next.val == cur.next.next.val),则使用一个临时指针temp从cur.next开始向后遍历,直到temp.next为空或者temp的值不等于temp.next的值,这样temp就指向了最后一个重复元素。然后将cur.next指向temp.next,即跳过了所有重复的元素,实现了删除操作。
-
移动指针:如果cur的下一个节点和下下一个节点的值不相等,则直接移动cur指针到cur.next,继续检查下一对节点。
-
返回结果:遍历完成后,返回哑结点的下一个节点dummyNode.next,即为删除了所有重复元素后的链表的头节点。
/**
* 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) {
// 删除所有具有重复元素
// 创建一个哑结点
ListNode dummyNode = new ListNode(-1);
dummyNode.next = head;
ListNode cur = dummyNode;
while(cur.next != null && cur.next.next != null){
if(cur.next.val == cur.next.next.val){
ListNode temp = cur.next;
// 跳过所有重复的元素
while(temp != null && temp.next != null && temp.val == temp.next.val){
temp = temp.next;
}
cur.next = temp.next;
}else{
cur = cur.next;
}
}
return dummyNode.next;
}
}