题目描述
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。
示例 1:
输入: 1->2->3->3->4->4->5输出: 1->2->5
示例 2:
输入: 1->1->1->2->3输出: 2->3
解题思路
由于重复的节点要全部删掉,所以再删除时要先保存重复节点的前一个节点,注意特殊情况是链表的开头就是重复节点,所以应首先找到链表从左往右第一个不重复的节点作为头节点,若头节点不为空,再从其后一个节点开始遍历,如果是重复节点就找到该重复节点后面第一个不重复的节点,并将不重复节点拼接到上一个不重复节点之后,直到链表末尾。
代码
1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * ListNode *next; 6 * ListNode(int x) : val(x), next(NULL) {} 7 * }; 8 */ 9 class Solution {10 public:11 ListNode* deleteDuplicates(ListNode* head) {12 if(head == NULL) return NULL;13 ListNode *left = head;14 while(left && left->next && left->val == left->next->val){15 int val = left->val;16 while(left && left->val == val)17 left = left->next;18 }19 if(left == NULL) return NULL;20 head = left;21 ListNode *right;22 while(left){23 right = left->next;24 while(right && right->next && right->val == right->next->val){25 int val = right->val;26 while(right && right->val == val)27 right = right->next;28 }29 left->next = right;30 left = right;31 }32 return head;33 }34 };