给定一个排序链表,删除所有重复的元素只留下原链表中没有重复的元素。
样例
给出 1->2->3->3->4->4->5->null
,返回 1->2->5->null
给出 1->1->1->2->3->null
,返回 2->3->null
解题思路:
照例新建一个dummy节点作为首部,然后用两个指针left与right分别指向重复元素的前一个元素和重复元素的后一个元素,使得(left , right)之间为重复元素。如果中间没有重复元素则向后考察元素,如果有则将left->next = right即可删除中间重复元素。
始终注意right不要越界问题!
/**
* Definition of singly-linked-list:
* class ListNode {
* public:
* int val;
* ListNode *next;
* ListNode(int val) {
* this->val = val;
* this->next = NULL;
* }
* }
*/
class Solution {
public:
/**
* @param head: head is the head of the linked list
* @return: head of the linked list
*/
ListNode * deleteDuplicates(ListNode * head)
{
// write your code here
ListNode * dummy = new ListNode(0);
dummy->next = head;
//使得(left,right)之间的元素是重复的数字,前开后开
ListNode * left = dummy;//指向重复元素的前一个元素
ListNode * right = head;
while(right != NULL)
{
right = right->next;
//将right指针指向重复元素的后一个元素
while(right != NULL && left->next->val == right->val)
right = right->next;
if(left->next->next != right)//如果两指针间存在重复元素,则将left与right连接,删除重复元素
left->next = right;
else//否则就移动这两指针
left = left->next;
}
return dummy->next;
}
};