鏈表去重

數據結構上機實驗上的一道題。算法

一帶頭結點的單鏈表,設計算法將表中值相同的元素僅保留一個結點。數據結構

 提示:指針p從鏈表的第一個元素開始,利用指針q從指針p位置開始向後搜索整個鏈表,刪除與之值相同的元素;指針p繼續指向下一個元素,開始下一輪的刪除,直至p==null爲至,既完成了對整個鏈表元素的刪除相同值。ide

解題思路:按照提示的意思就是一個雙重循環的查找,像是暴力算法從母串中查找子串?我最開始就直接使用編寫好的刪除函數套在雙重循環裏面,這樣作是能夠的,可是時間複雜度有點高,O(n^3)!!!函數

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 typedef struct Node
  4 {
  5     int data;
  6     struct Node * next;
  7 } Node,*LinkList;
  8 int Delete(LinkList * L,int Location)
  9 {
 10     LinkList q,p;
 11     int counts=0;
 12     int k=Location+1;
 13     q=(*L);
 14     p=(*L)->next;
 15     while(p->next)
 16     {
 17         q=q->next;
 18         p=p->next;
 19         counts++;
 20         if(counts==Location)
 21         {
 22             q->next=p->next;
 23         }
 24     }
 25     return 1;
 26 }
 27 int Unique(LinkList *L)
 28 {
 29     LinkList p,q;
 30     int counts=1;
 31     int ans=0;
 32     p=(*L)->next;
 33     while(p)
 34     {
 35         q=p->next;
 36         counts=ans+1;;
 37         while(q)
 38         {
 39             if(p->data==q->data)
 40             {
 41                 Delete(L,counts);
 42             }
 43             else
 44             {
 45                 counts++;
 46             }
 47             q=q->next;
 48         }
 49         p=p->next;
 50         ans++;
 51     }
 52     return 1;
 53 }
 54 int Create(LinkList *L,int n)
 55 {
 56     LinkList p,q;
 57     int Elem,i;
 58     q=(*L);
 59     printf("請按輸入元素:\n");
 60     for(i=0; i<n; i++)
 61     {
 62         p=(LinkList)malloc(sizeof(Node));
 63         scanf("%d",&Elem);
 64         p->data=Elem;
 65         q->next=p;
 66         q=p;
 67     }
 68     p->next=NULL;
 69     return 1;
 70 }
 71 int InitLinkList(LinkList * L)
 72 {
 73     (*L)=(LinkList)malloc(sizeof(Node));
 74     if((*L)==NULL)
 75     {
 76         printf("ERROR\n");
 77         return 0;
 78     }
 79     (*L)->next=NULL;
 80     return 1;
 81 }
 82 void Print(LinkList *L)
 83 {
 84     LinkList p;
 85     p=(*L)->next;
 86     while(p)
 87     {
 88         printf("%d ",p->data);
 89         p=p->next;
 90     }
 91     printf("\n");
 92 }
 93 int main()
 94 {
 95     LinkList L;
 96     int Number;
 97     InitLinkList(&L);
 98     printf("請輸入元素的個數:\n");
 99     scanf("%d",&Number);
100     Create(&L,Number);
101     printf("原先的元素有\n");
102     Print(&L);
103     Unique(&L);
104     printf("去重後的元素有\n");
105     Print(&L);
106     return 0;
107 }
View Code

更改後的去重背調函數:spa

 1 int Unique(LinkList *L)
 2 {
 3     LinkList p,q,k;
 4     q=p=(*L)->next;
 5     while(p->next)///查找和節點p重複的節點,重複則刪除。
 6     {
 7         q=p;
 8         k=q->next;
 9         while(k)
10         {
11             if(k->data==p->data)///重複判斷
12             {
13                 q->next=k->next;///從鏈表裏刪除
14                 free(k); ///實際刪除節點,釋放內存
15                 k=q->next; ///保持k=q->next;
16             }
17             else
18             {
19                 q=k;
20                 k=k->next;
21             }
22         }
23         if(p->next)
24         {
25             p=p->next;
26         }
27     }
28     return 1;
29 }

可以將時間複雜度將到O(n^2)設計