LeetCode—82. Remove Duplicates from Sorted List II
题目
https://leetcode.com/problems/remove-duplicates-from-sorted-list-ii/description/
这道题是82的进阶,要求吧链表中所有有重复的元素去掉,只剩下出现一次的节点。
思路及解法
首先我们先确定有3个指针:一个头指针dummy,一个游走指针ranger,还有一个指针用来指明新生成的链表的后端位置在哪里。
然后我们确定用什么样的策略挑出想留下的节点。策略是这样的:首先ranger开始游走,一旦ranger的next为空或者ranger的下一个节点的val和ranger的val相等,ranger就停下;注意此时,我们去判断guard和ranger是不是相邻的(这个很关键,而不是去判断val是不是相等什么的),因为按照前面ranger游走的方式,若是相邻,说明guard和ranger指向的节点都是单一节点,那么我们让guard=ranger,若是不相邻,此时ranger指向的是重复元素的最后一个,那么我们让guard的next指向ranger的next,ranger继续等于ranger的next。也就是用guard的next将链表连起来。
代码
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode deleteDuplicates(ListNode head) {
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode guard = dummy;
ListNode ranger = head;
if(head == null) return null;
while(ranger != null){
while(ranger.next != null && ranger.val == ranger.next.val){
ranger = ranger.next;
}
if(guard.next == ranger){
guard = ranger; //添加元素到新链表操作
}else{
guard.next = ranger.next; //删除重复元素的操作
}
ranger = ranger.next;
}
return dummy.next;
}
}