反转链表

507 字
3 分钟
反转链表

反转链表#

递归反转链表#

递归反转链表的思想是,递归到链表末尾,再从尾至头得反转链表指针

递归的好处就是比迭代法代码量少,且更读易懂。坏处就是容易爆栈,在主流的语言中一般递归个几千层就会爆栈

首先我们需要创建一个函数,我们只需要向其传递一个值,就是指向链表头的指针

void Reverse(Linked* p){}

然后再判断这个指针非空,并递归到末尾

void Reverse(Linked* p){
if(p -> next == nullptr){
return;
}
re(p -> next)
}

假设我们有个一个全局变量head,那就让其指向末尾元素

void Reverse(Linked* p){
if(p -> next == nullptr){
head = p;
return;
}
Reverse(p -> next);
}

随后再从后往前遍历,让后面的元素指向前面的元素

void Reverse(Linked* p){
if(p -> next == nullptr){
head = p;
return;
}
Reverse(p -> next);
Linked* q = p -> next;
//定义q表示下一位元素
q -> next = p;
//使后面的元素指向前面的元素
p -> next = nullptr;
//把当前元素指针归零,如果是第一位元素则反转后不指向任何元素,如果不是则没有影响
}

迭代反转列表#

首先我们还是需要创建一个函数,但我们不需要往里面传递值了,直接调用全局变量就好

void Reverse(){}

我们需要遍历链表并反转其指针

void Reverse(){
Linked* p = head;
while(next != nullptr){
p = p -> next;
}
}

但我们发现要是直接反转链表的话,下一位元素就会丢失,并且链表也没办法传递上一位的值,所以我们需要额外的两个变量来存储上一位和下一位

void Reverse(){
Linked* last,current,next;
//分别表示上一位,这一位和下一位
current = head;
last = nullptr;
while(current != nullptr){
next = current -> next;
current -> = last;
last = current;
current = next;
//整体前移
}
head = last;
//使头部指向末尾
}

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

反转链表
https://bomen2233.github.io/posts/2026-08-04-15-42/
作者
Makise Renoka
发布于
2026-08-04
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
Makise Renoka
我们被生命厌恶着
公告
欢迎来到我的博客!
分类
标签
最新动态
站点统计
文章
10
动态
6
分类
6
标签
5
总字数
6,088
运行时长
0
最后活动
0 天前
站点信息
构建平台
Cloudflare Pages
博客版本
Firefly v6.14.3
文章许可
CC BY-NC-SA 4.0