版权声明:版权所有,转载请注明原网址链接。 https://blog.csdn.net/qq_41231926/article/details/82963136
我的LeetCode代码仓:https://github.com/617076674/LeetCode
原题链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list-ii/description/
题目描述:
知识点:链表
思路:三指针遍历链表
为了消除对头节点的特殊处理,设立虚拟头节点dummyHead。cur1指针指向当前节点的前一个节点,cur2指针指向当前节点,cur3指针指向当前节点的后一个节点。
只要cur3不为null就持续以下循环:
如果cur3的值和cur2的值相同,需要循环使得cur3 = cur3.next,直至cur3的值和cur2的值不相等为止。如果在这个循环过程中cur3为null了,直接舍弃cur2指针及其后面的所有节点即可。否则需要进行三个指针的重定向操作。
如果cur3的值和cur2的值不相同,只需继续遍历下一个节点即可。
时间复杂度是O(n),其中n为链表的长度。空间复杂度为O(1)。
JAVA代码:
public class Solution {
public ListNode deleteDuplicates(ListNode head) {
if(head == null || head.next == null){
return head;
}
ListNode dummyHead = new ListNode(-1);
dummyHead.next = head;
ListNode cur1 = dummyHead;
ListNode cur2 = cur1.next;
ListNode cur3 = cur2.next;
while(cur3 != null){
if(cur2.val != cur3.val){
cur1 = cur2;
cur2 = cur3;
cur3 = cur3.next;
}else {
while (cur2.val == cur3.val) {
cur3 = cur3.next;
if (cur3 == null) {
cur1.next = null;
return dummyHead.next;
}
}
cur1.next = cur3;
cur2 = cur3;
cur3 = cur3.next;
}
}
return dummyHead.next;
}
}
LeetCode解题报告: