循環鏈表
阿新 • • 發佈:2017-06-21
oid lis ret main 如果 實現 結束 urn 是否
將單鏈表中終端節點的指針端由空指針改為指向頭結點,就使整個單鏈表形成一個環,這種頭尾相連的單鏈表稱為單循環鏈表,簡稱循環鏈表(circular linked list)。
循環鏈表解決了從一個節點,訪問到鏈表的全部節點的問題。循環鏈表和單鏈表的主要差異就在於循環的判斷條件上,原來是判斷p->next是否為空,現在則是p->next不等於頭結點,則循環結束。
在單鏈表中,訪問第一個節點需要O(1)的時間,但對於訪問最後一個節點,卻因為需要將單鏈表全部掃描一遍,所以需要O(n)的時間。如果用循環鏈表,我們只需用指向終端節點的尾指針來表示循環鏈表,此時查找開始節點和終端節點就都很方便了。
下面是示意圖:
下面是實現輸出頭結點和終端節點的代碼:
#include<stdio.h> #include<stdlib.h> struct node{ int a; struct node *next; }; typedef struct node *LinkList; void CreateList_T(LinkList head, intnum) { LinkList p, rear = head; while(num--){ p = new node; scanf("%d", &p->a); rear->next = p; rear = p; } rear->next = NULL; } int main() { int num; LinkList head = new node, rear; scanf("%d", &num); CreateList_T(head, num);for(rear = head; rear->next; rear = rear->next); rear->next = head; printf("%d\n", rear->a); printf("%d\n", rear->next->next->a); return 0; }
循環鏈表