【剑指offer】删除链表中重复的结点
题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
题解:链表是有序的,去除重复出现的元素,新建一个链表保存其它元素即可
/* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } }; */ class Solution { public: ListNode* deleteDuplication(ListNode* pHead) { ListNode* H= (ListNode*)malloc(sizeof(ListNode));//新建一个链表保存不重复出现的元素 ListNode* E=H; ListNode* now=pHead; while(now!=NULL) { if(now->next!=NULL && now->val==now->next->val) { ListNode* temp=now->next; while(temp->next!=NULL && temp->val==temp->next->val)//连续重复 temp=temp->next; now=temp->next; } else { E->next=now; E=E->next; now=now->next; } } E->next=NULL; return H->next; } };
自己另外写了个直接删除重复元素的,但是过不了,可能是内存泄漏了,也把它贴一下
#include<iostream> #include<stdlib.h> #include<string> #include<string.h> #include<algorithm> using namespace std; struct ListNode { int val; ListNode *next; }; ListNode* deleteDuplication(ListNode* pHead) { ListNode *now=(ListNode *)malloc(sizeof(ListNode)); now=pHead; while(now->next!=NULL) { ListNode *pre=now; now=now->next; if(now->next!=NULL&&now->val==now->next->val) { ListNode *temp=now->next; while(temp->next!=NULL&&temp->val==temp->next->val) temp=temp->next; pre->next=temp->next; now=pre; } } return pHead->next; } int main() { int n, m; cin >> n; ListNode *H = (ListNode*)malloc(sizeof(ListNode)); ListNode *E = (ListNode*)malloc(sizeof(ListNode)); E = H; for (int i = 0; i < n; i++) { cin >> m; ListNode* temp = (ListNode*)malloc(sizeof(ListNode)); temp->val = m; temp->next = NULL; E->next = temp; E = temp; } ListNode *tp = deleteDuplication(H); while (tp != NULL) { cout << tp->val << ' '; tp = tp->next; } cout << endl; return 0; }
等风起的那一天,我已准备好一切