版权声明:由于一些问题,理论类博客放到了blogger上,希望各位看官莅临指教https://efanbh.blogspot.com/;本文为博主原创文章,转载请注明本文来源 https://blog.csdn.net/wyf826459/article/details/82894019
题目描述:
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
算法实现:
问题关键在于对于重复的元素一个也不能留,思路说出来比较简单,只要将重复元素的最后一个的next链接到重复元素的前一个元素的next上即可,
而对于重复元素的前一个元素的记录要分为重复元素是不是从头开始的两种情况考虑,为了避免这种麻烦,我们新建一个节点,将原链表链接到这个节点上,具体算法如下
/**
* 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 == NULL) return head;
ListNode *P1, *P2;
ListNode *P = new ListNode(0);
P2 = P;
P1 = head;
P2 -> next = P1;
bool flag = false;
while(P1 -> next != NULL){
flag = false;
while(P1 -> next != NULL && P1 -> next -> val == P1 -> val){
flag = true;
P1 = P1 -> next;
}
if(flag){
if(P1 -> next == NULL)P2 -> next = NULL;
else {
P1 = P1 -> next;
P2 -> next = P1;
}
}
else{
P2 = P1;
P1 = P1 -> next;
}
}
return P -> next;
}
};