前言
双向链表(Doubly Linked List)是一种链表数据结构,每个节点包含两个指针,一个指向前一个节点,一个指向后一个节点。相比于单链表,双链表可以双向遍历,因此在某些情况下更加灵活和高效。
实现原理
- 节点结构:每个节点包含两个指针,一个指向前一个节点,一个指向后一个节点。通常,节点结构包含数据和两个指针字段。
struct Node {int data;struct Node* prev; // 指向前一个节点struct Node* next; // 指向后一个节点 };
- 头指针和尾指针:通常情况下,双链表有两个指针分别指向链表的头节点和尾节点。这样可以方便在链表两端进行插入和删除操作。
- 插入操作:在双链表中插入节点需要考虑前一个节点和后一个节点的指针调整。具体步骤如下:
- 新节点的
prev
指针指向前一个节点; - 新节点的
next
指针指向后一个节点; - 前一个节点的
next
指针指向新节点; - 后一个节点的
prev
指针指向新节点。
- 新节点的
-
删除操作:在双链表中删除节点也需要考虑前一个节点和后一个节点的指针调整。具体步骤如下:
- 将前一个节点的
next
指针指向要删除节点的后一个节点; - 将后一个节点的
prev
指针指向要删除节点的前一个节点; - 释放要删除的节点内存。
- 将前一个节点的
-
遍历操作:由于双链表的节点有两个指针,因此可以从头节点或尾节点开始,沿着
next
指针或prev
指针遍历整个链表。 -
特殊情况:在插入或删除头节点或尾节点时,需要特别处理头指针和尾指针的变化。
动画演示过程
Linked List Stack Visualization
代码实现
#include <stdio.h>
#include <stdlib.h>// 定义节点结构
struct Node {int data;struct Node* prev;struct Node* next;
};// 创建新节点
struct Node* createNode(int data) {struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));if (newNode == NULL) {printf("Memory allocation failed\n");exit(1);}newNode->data = data;newNode->prev = NULL;newNode->next = NULL;return newNode;
}// 在链表末尾插入节点
void insertAtEnd(struct Node** headRef, int data) {struct Node* newNode = createNode(data);if (*headRef == NULL) {*headRef = newNode;return;}struct Node* current = *headRef;while (current->next != NULL) {current = current->next;}current->next = newNode;newNode->prev = current;
}// 打印链表
void printList(struct Node* head) {struct Node* current = head;printf("List: ");while (current != NULL) {printf("%d ", current->data);current = current->next;}printf("\n");
}int main() {struct Node* head = NULL;// 在链表末尾插入节点insertAtEnd(&head, 1);insertAtEnd(&head, 2);insertAtEnd(&head, 3);// 打印链表printList(head);return 0;
}