之前單鏈表中,數組全初始化為0,末尾最后一個next 存的就是0,指向的就是頭節點
循環鏈表的基本概念
循環鏈表是一種特殊的鏈表,其尾節點的指針域指向頭節點,形成一個閉環。與普通單鏈表相比,循環鏈表的遍歷需要額外注意終止條件,避免無限循環。
循環鏈表的節點結構
循環鏈表的節點與普通鏈表節點相同,包含數據域和指針域。以C語言為例:
typedef struct Node {int data; // 數據域struct Node *next; // 指針域,指向下一個節點
} Node;
循環鏈表的初始化
初始化時,頭節點的指針域指向自身,形成空循環鏈表:
Node* initList() {Node *head = (Node*)malloc(sizeof(Node));if (head != NULL) {head->next = head; // 頭節點指向自身}return head;
}
循環鏈表的插入操作
頭插法
新節點插入到頭節點之后:
void insertAtHead(Node *head, int data) {Node *newNode = (Node*)malloc(sizeof(Node));newNode->data = data;newNode->next = head->next;head->next = newNode;
}
尾插法
新節點插入到尾節點之后(需先遍歷到尾節點):
void insertAtTail(Node *head, int data) {Node *current = head;while (current->next != head) {current = current->next;}Node *newNode = (Node*)malloc(sizeof(Node));newNode->data = data;newNode->next = head;current->next = newNode;
}
循環鏈表的刪除操作
刪除指定值的節點:
void deleteNode(Node *head, int data) {Node *current = head;while (current->next != head) {if (current->next->data == data) {Node *temp = current->next;current->next = temp->next;free(temp);return;}current = current->next;}
}
循環鏈表的遍歷
遍歷時需檢查是否回到頭節點:
void traverseList(Node *head) {Node *current = head->next;while (current != head) {printf("%d ", current->data);current = current->next;}printf("\n");
}
循環鏈表的銷毀
釋放所有節點內存,避免內存泄漏:
void destroyList(Node *head) {Node *current = head->next;while (current != head) {Node *temp = current;current = current->next;free(temp);}free(head);
}
注意事項
- 終止條件:循環鏈表的遍歷和操作需明確終止條件(如
current != head
),否則會陷入無限循環。 - 邊界處理:空鏈表時需確保頭節點指向自身。
- 內存管理:動態分配的內存需及時釋放。
通過上述方法,可以完整實現循環鏈表的基本操作。