守望初心

靡有不初,鲜克有终。。。

导航

[002] delete_duplication_of_linked_list

Posted on 2014-10-22 16:04  Reynold Liu  阅读(176)  评论(0编辑  收藏  举报

[Description] Given a unsort linked list, delete all the duplication from them, no temporary space permission.

[Thought] Set two points, from head to tail, scaning all linked list. O(n^2).

[Implementation] C code:

 1 #include<stdio.h>
 2 
 3 typedef struct linkedList
 4 {
 5         int data;
 6         struct linkedList* next;
 7 } llist;
 8 
 9 llist** delDupli(llist **head)
10 {
11         // two point, t1 for target, t2 for mover.
12         llist *t1, *t2;
13         t1=t2=*head;
14         while(t1->next != NULL)
15         {
16                 // ajust t2 from t1!
17                 t2=t1;
18                 while(t2->next != NULL)
19                 {
20                         // check if they are the same
21                         if(t2->next->data == t1->data)
22                         {
23                                 // move t2->next; note: no memory free here.
24                                 t2->next=t2->next->next;
25                         }
26                         // after move out node, check if t2 is already the last one.
27                         if(t2->next != NULL)
28                         {
29                                 t2=t2->next;
30                         }
31                 }
32                 t1=t1->next;
33         }
34         return head;
35 }
36 
37 int addValue(llist **head, int val)
38 {
39 
40         llist *pnode;
41         llist *t=*head;
42         // apply memory for linked list.
43         pnode=(llist*)malloc(sizeof(llist));
44         if(NULL==pnode)
45         {
46                 return 0;
47         }
48         pnode->data=val;
49         pnode->next=NULL;
50         // first node
51         if(NULL==*head)
52         {
53                 *head=pnode;
54                 return 1;
55         }
56         // move temp point to the last node
57         while(t->next != NULL)
58         {
59                 t=t->next;
60         }
61         t->next=pnode;
62         return 1;
63 }
64 
65 // out put data, be careful about the first node.
66 int printList(llist **head)
67 {
68         llist *t=*head;
69         printf("%d, ",t->data);
70         while(t->next != NULL)
71         {
72                 t=t->next;
73                 printf("%d, ",t->data);
74         }
75         printf("\n");
76         return 1;
77 }
78 
79 int main()
80 {
81         int a[]={2,3,5,6,8,2,4,6,8,9,2,5,2};
82         llist *head=NULL;
83         int i;
84 
85         for(i=0;i<(sizeof(a)/sizeof(a[0]));i++)
86         {
87 //              printf("a[i]:%d\n",a[i]);
88                 addValue(&head,a[i]);
89 //              printList(&head);
90         }
91         printf("Initial linked list:\n");
92         printList(&head);
93         printf("After deleting:\n");
94         printList(delDupli(&head));
95 }