【题目】
给定一个有序的链表,删除所有有重复数字的节点,只保留原始列表中唯一的数字。
例如:
给定 ->->->->->-> ,则返回 ->->
给定 ->->->-> ,则返回 ->
【思路】
【这道题只遍历一次的方法我居然没想出来】
新建立个节点,指向头结点。
使用两个指针pre和cur,pre始终指向链表前一部分非重复元素的最后一个节点,cur指向pre指向的节点后重复元素的最后一个节点。当pre->next == cur时,说明cur->val是唯一元素,不用删除,否则pre->next = cur->next。
【代码】
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
"""
p = ListNode()
p.next = head
pre = p
cur = head
while cur:
while cur.next and pre.next.val == cur.next.val:
cur = cur.next
if pre.next == cur:
pre = pre.next
else:
pre.next = cur.next
cur = cur.next
return p.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) {
if(!head || !head->next)
return head;
ListNode* p = new ListNode();
p->next = head;
ListNode* q = NULL;
ListNode* cur = head;
ListNode* pre = p;
while(cur){
// 找到(重复)元素最后一个元素位置
while(cur->next && pre->next->val == cur->next->val){
cur = cur->next;
}
if(pre->next == cur)
pre = pre->next;
else
pre->next = cur->next;
cur = cur->next;
}
return p->next;
}
};