1. 概念
對鏈表而言,雙向均可遍歷是最方便的,另外首尾相連循環遍歷也可大大增加鏈表操作的便捷性。因此,雙向循環鏈表,是在實際運用中是最常見的鏈表形態。
2. 基本操作
與普通的鏈表完全一致,雙向循環鏈表雖然指針較多,但邏輯是完全一樣。基本的操作包括:
- 節點設計
- 初始化空鏈表
- 增刪節點
- 鏈表遍歷
- 銷毀鏈表
3. 節點設計
雙向鏈表的節點只是比單向鏈表多了一個前向指針。示例代碼如下所示:
typedef struct node
{// 以整型數據為例int data; // 指向相鄰的節點的雙向指針struct node * prev;struct node * next;
}node;
3. 初始化
所謂初始化,就是構建一條不含有效節點的空鏈表。
以帶頭結點的雙向循環鏈表為例,初始化后,其狀態如下圖所示:
在初始空鏈表的情況下,鏈表只有一個頭結點,下面是初始化示例代碼:
node * initList()
{// 申請頭結點node * head = malloc(sizeof(node));// 讓首尾互相指向// 不需要對頭結點的 data 做任何操作if(head != NULL){head->prev = head;head->next = head;}return head;
}
4. 插入節點
與單鏈表類似,也可以對雙鏈表中的任意節點進行增刪操作,常見的有所謂的頭插法、尾插法等,即:將新節點插入到鏈表的首部或者尾部,示例代碼是:
- 頭插法:將新節點插入到鏈表的頭部
// 將新節點new,插入到鏈表的首部
void insertHead(node *head, node