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
给你一个有序链表,不是值唯一的结点就都删除。
思路:
头结点可能会变。增加一个dummy结点:链表的第一个node,因为没有前驱节点,所以该node需要特殊处理,会导致额外的代码量。如果创建一个dummy,将其作为第一个node的前驱节点,这样链表中所有的node都可以也能够同样的逻辑来处理了。
从dummy开始遍历,如果存在值重复就抛弃所有值重复的结点,进入下一个结点继续同样的判断,唯一的话prex下移保留住这个结点。
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 dummy(0);
dummy.next = head;//记住头结点
ListNode *pre = &dummy;
while (pre->next)
{
ListNode *cur = pre->next;
while (cur->next && cur->val == cur->next->val)
cur = cur->next;
if (cur != pre->next)//存在相同的结点,则相同的结点都跳过
pre->next = cur->next;
else
pre = pre->next;
}
return dummy.next;
}
};