数据结构与算法之链表 链表反转 迭代法指针变化 图示

数据结构与算法阿木 发布于 2025-07-11 7 次阅读


摘要:

链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。链表反转是链表操作中的一个基本任务,它可以通过多种方法实现,其中迭代法是其中一种。本文将围绕链表反转的迭代法,通过指针变化的过程,详细解析其实现原理和代码实现。

一、

链表反转是链表操作中的一个重要任务,它可以将链表的顺序颠倒,使得链表的最后一个节点变为第一个节点。迭代法是链表反转的一种实现方式,通过改变指针的指向来实现链表的反转。本文将详细介绍迭代法链表反转的实现原理和代码实现。

二、链表的基本概念

1. 链表的定义

链表是一种线性数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。链表中的节点可以是动态分配的,因此链表具有动态扩展和收缩的特点。

2. 链表的类型

链表可以分为单链表、双向链表和循环链表等类型。本文主要讨论单链表的反转。

三、迭代法链表反转原理

迭代法链表反转的基本思想是通过遍历链表,逐步改变节点的指针指向,使得链表的顺序颠倒。具体步骤如下:

1. 初始化三个指针:prev指向null,cur指向头节点,next指向cur的下一个节点。

2. 遍历链表,在遍历过程中,将cur的指针指向prev,然后移动prev和cur指针。

3. 当cur指向null时,prev指向新的头节点,即原链表的最后一个节点。

四、代码实现

以下是用C语言实现的迭代法链表反转的代码示例:

c

include <stdio.h>


include <stdlib.h>

// 定义链表节点结构体


typedef struct Node {


int data;


struct Node next;


} Node;

// 创建链表


Node createList(int arr[], int size) {


Node head = NULL;


Node tail = NULL;


for (int i = 0; i < size; i++) {


Node newNode = (Node)malloc(sizeof(Node));


newNode->data = arr[i];


newNode->next = NULL;


if (head == NULL) {


head = newNode;


tail = newNode;


} else {


tail->next = newNode;


tail = newNode;


}


}


return head;


}

// 打印链表


void printList(Node head) {


Node cur = head;


while (cur != NULL) {


printf("%d ", cur->data);


cur = cur->next;


}


printf("");


}

// 迭代法链表反转


Node reverseList(Node head) {


Node prev = NULL;


Node cur = head;


Node next = NULL;


while (cur != NULL) {


next = cur->next; // 保存下一个节点


cur->next = prev; // 改变当前节点的指针指向


prev = cur; // 移动prev和cur指针


cur = next;


}


return prev; // prev指向新的头节点


}

int main() {


int arr[] = {1, 2, 3, 4, 5};


int size = sizeof(arr) / sizeof(arr[0]);


Node head = createList(arr, size);


printf("Original List: ");


printList(head);


head = reverseList(head);


printf("Reversed List: ");


printList(head);


return 0;


}


五、总结

本文详细介绍了迭代法链表反转的实现原理和代码实现。通过改变指针的指向,我们可以轻松地将链表的顺序颠倒。在实际应用中,链表反转操作在数据结构处理、算法优化等方面具有重要意义。

六、拓展

1. 递归法链表反转

除了迭代法,递归法也是一种实现链表反转的方法。递归法通过递归调用函数,逐步改变节点的指针指向,实现链表反转。

2. 双向链表反转

双向链表是一种具有两个指针的链表,分别指向前一个节点和后一个节点。双向链表的反转可以通过改变两个指针的指向来实现。

3. 循环链表反转

循环链表是一种特殊的链表,其最后一个节点的指针指向头节点。循环链表的反转可以通过改变头节点和尾节点的指针指向来实现。

通过学习链表反转的不同实现方法,我们可以更好地理解和掌握链表操作,为后续的数据结构和算法学习打下坚实基础。