题目:
Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numbers from the original list.
Example 1:Input: 1->2->3->3->4->4->5 Output: 1->2->5
Example 2:
Input: 1->1->1->2->3 Output: 2->3
解释:
删除排好序的链表中所有的重复元素,只留下链表中本身只出现过一次的元素。由于头结点head
本身有可能也是重复的,也就是最终返回的有可能不是最初的head
了,所以需要定义一个新的头结点。
preHead
指向原始head
的前一个结点,工作指针pre
初始化为preHead
,工作指针cur
初始化为pre.next
(也就是初始化为head
),之后pre
始终指向当前已经不重复的链表的最后一个元素,pre.next
表示新进来的一个需要判断是不是重复元素的值,经过while
遍历后,cur
指向重复元素的最后一个元素(如果该元素值出现一次,那么cur
指向该元素),如果pre.next==cur
证明此时cur
所指向的元素值出现过一次,直接pre=pre.next
(也就是让pre
指向cur
所指向的位置),否则说明cur
所指向的元素出现了很多次,而且cur
指向的是最后一次出现的位置,此时应该把cur
所指向的元素跳过,用pre.next
寻找新的元素,即pre.next=cur.next
,最后都需要更新cur
cur=cur.next
,使得cur
指向一个新的元素。
总而言之是需要两个工作指针的啦!
python代码;
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def deleteDuplicates(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
preHead=ListNode(0)
preHead.next=head
pre=preHead
cur=pre.next
while cur:
while cur.next and cur.next.val==pre.next.val:
cur=cur.next
if pre.next==cur:
pre=pre.next
else:
pre.next=cur.next
cur=cur.next
return preHead.next
c++代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
ListNode* preHead=new ListNode(0);
preHead->next=head;
ListNode* pre=preHead;
ListNode* cur=pre->next;
while(cur)
{
while(cur->next &&cur->next->val==pre->next->val)
cur=cur->next;
//现在指针cur指向重复值的最后一个元素
//这表示值出现过一次
if(pre->next==cur)
//== pre.next=cur;
pre=pre->next;
//这表示是重复元素,需要跳过
else
pre->next=cur->next;
//循环语句的末尾需要更新cur
cur=cur->next;
}
return preHead->next;
}
};
总结:
删除重复元素的所有的值的话,需要两个工作指针。