链表反转(转载)
程序员文章站
2022-04-22 19:03:07
...
例题描述
反转一个链表
示例:
- 输入:
1->2->3->4->5->NULL
- 输出:
5->4->3->2->1->NULL
结构体定义
struct ListNode {
int val;
struct ListNode *next;
};
思路一
先对原链表做头删操作,再对新链表做头插
- 定义一个新
head
头指针,标记为newHead
,将它初始为NULL
,并非指向NULL
,最后我们选择返回这个newHead
指针作为新链表的头指针。
- 定义一个结点
node
作为"临时中转站",初始化与否并无大影响。 - 进行循环遍历链表各个结点,判定
head
指针是否为空,即是否到达了原链表的结尾。如果不为空,说明还没有到达尾部。如果程序第一次运行就没有进入循环,说明传入了一个空链表,此时返回newHead
新链表的头指针,同样返回NULL
,这样处理也是合理的。 - 以下开始逆序链表逻辑:在当前指针不为
NULL
时,先对原链表做头删操作,再对新链表做头插操作。即使用循环进行操作: - 让
node
指针指向传入函数链表的头指针head
,两指针指向保持相同。
- 然后让
head
指针指向它的next
结点,此时旧链表已经完成了头删操作。第一个结点已经被"切割"下来。接下来要做的就是对新链表进行头插操作,使结点放入新链表。
- 让
node
指针的next
下一个结点指向新链表的头指针newHead
,完成结点的链接,即头插入新的链表中。然后更新newHead
指向为新链表的头结点。进行下一次循环。
8. 最终head
指针指向了原链表的结尾,即为NULL
,退出循环,此时新链表已经反转完毕,情况如图:
- 最终返回新链表头指针
newHead
即可。
思路二
- 利用选择语句,找到空链表的情况,此情况返回
NULL
空指针,因为空链表不能反转,或者说反转之后还是一个空链表,返回空。 - 利用三个指针
p0
"前指针"、p1
“当前指针”、p2
"后指针"来分批处理链表元素,p0
置为NULL
,它将作为链表的尾结点向前推进处理,p1
指向旧链表的头指针head
,p2
指向旧链表的头指针的next
结点。
- 开始遍历链表,循环判定因子为
p1
,当它为空时到达链表尾部跳出循环。否则在表中执行循环内逻辑:将p1
指向的当前结点的下一个结点指向p0
,即前一个结点。
此时p0
为NULL
,那么p1
的下一个结点就为空了,它现在是最后一个结点。
- 然后将
p0
指针指向p1
,将p1
指针指向p2
,注意这两步不可以调换顺序,否则正确向后挪移一位。此时完成了三个指针的一轮更迭。 - 判定
p2
指针是否为空,如果为空说明此时p2
到达了链表结尾,当前指针p1
的指向为最后一个结点,它的next
即为空。如果不为空,将p2
更新到下一个结点,进行下一次循环。
- 下一次进行循环时,就会把截断结点链接到新链表的头部,同时更新三个指针。继续循环。
- 循环终止条件为:
p1
指向了链表尾部的NULL
,此时p1
的前指针p0
即指向了反转后的链表,它就是新链表的head
头指针。此时返回p0
即可。
例题描述
反转一个链表
示例:
- 输入:
1->2->3->4->5->NULL
- 输出:
5->4->3->2->1->NULL
结构体定义
struct ListNode {
int val;
struct ListNode *next;
};
思路一
先对原链表做头删操作,再对新链表做头插
- 定义一个新
head
头指针,标记为newHead
,将它初始为NULL
,并非指向NULL
,最后我们选择返回这个newHead
指针作为新链表的头指针。
- 定义一个结点
node
作为"临时中转站",初始化与否并无大影响。 - 进行循环遍历链表各个结点,判定
head
指针是否为空,即是否到达了原链表的结尾。如果不为空,说明还没有到达尾部。如果程序第一次运行就没有进入循环,说明传入了一个空链表,此时返回newHead
新链表的头指针,同样返回NULL
,这样处理也是合理的。 - 以下开始逆序链表逻辑:在当前指针不为
NULL
时,先对原链表做头删操作,再对新链表做头插操作。即使用循环进行操作: - 让
node
指针指向传入函数链表的头指针head
,两指针指向保持相同。
- 然后让
head
指针指向它的next
结点,此时旧链表已经完成了头删操作。第一个结点已经被"切割"下来。接下来要做的就是对新链表进行头插操作,使结点放入新链表。
- 让
node
指针的next
下一个结点指向新链表的头指针newHead
,完成结点的链接,即头插入新的链表中。然后更新newHead
指向为新链表的头结点。进行下一次循环。
8. 最终head
指针指向了原链表的结尾,即为NULL
,退出循环,此时新链表已经反转完毕,情况如图:
- 最终返回新链表头指针
newHead
即可。