首页 > 代码库 > careercup-链表 2.1

careercup-链表 2.1

2.1 编写代码,移除未排序链表中的重复节点。

不使用临时缓存:

如果不允许使用临时的缓存(即不能使用额外的存储空间),那需要两个指针, 当第一个指针指向某个元素时,第二个指针把该元素后面与它相同的元素删除, 时间复杂度O(n2 )。

C++实现代码:

#include<iostream>#include<new>using namespace std;struct ListNode{    int val;    ListNode *next;    ListNode(int x):val(x),next(NULL) {}};void createList(ListNode *&L){    int arr[10]= {1,2,3,2,5,6,7,3,9,1};    int i;    ListNode *p=NULL;    for(i=0; i<10; i++)    {        ListNode *tmp=new ListNode(arr[i]);        if(L==NULL)        {            L=tmp;            p=tmp;        }        else        {            p->next=tmp;            p=tmp;        }    }}void deleteDup(ListNode *L){    if(L==NULL)        return;    ListNode *p=L;    ListNode *q=NULL;    ListNode *qpre=NULL;    ListNode *tmp=NULL;    while(p)    {        if(p->next)        {            if(p->val==p->next->val)            {                tmp=p->next;                p->next=tmp->next;                tmp->next=NULL;                delete(tmp);                continue;            }            else                q=p->next;        }        while(q)        {            if(q->val==p->val)            {                tmp=q;                q=q->next;                tmp->next=NULL;                qpre->next=q;                delete(tmp);            }            if(q)            {                qpre=q;                q=q->next;            }        }        p=p->next;    }}int main(){    ListNode *head=NULL;    createList(head);    ListNode *p=head;    while(p)    {        cout<<p->val<<" ";        p=p->next;    }    cout<<endl;    deleteDup(head);    p=head;    while(p)    {        cout<<p->val<<" ";        p=p->next;    }    cout<<endl;}

运行结果:

careercup-链表 2.1