反转一个单链表
0.前言
单链表可以理解为一个结构体成员里面有数值,和指针,只不过指针指向下一个数值。
可惜网上的资源只有答案,没有答案的解释,特别是四个指针赋值语句的理解,请看后面第三部分的循环图解!
具体要求如下:
1.可以用递归方式或者循环
1.1 使用循环代码如下:
便于理解版本
class ListNode:
def __init__(self, x):
self.val = x;
self.next = None;
def reverseList(head):
prev = None
while head:
curr = head
head = head.next
curr.next = prev
prev = curr
return prev
head = ListNode(1); # 测试代码
p1 = ListNode(2); # 建立链表1->2->3->4->None;
p2 = ListNode(3);
p3 = ListNode(4);
head.next = p1;
p1.next = p2;
p2.next = p3;
p = ListNode.reverseList(head); # 输出链表 4->3->2->1->None
while p:
print(p.val)
p = p.next;
1.2 递归实现如下:
2.参考网址
单链表反转python实现 https://blog.youkuaiyun.com/u011608357/article/details/36933337
链表(上:链表反转) https://www.jianshu.com/p/839956f519da
3.循环实现的图解
关键看懂四个赋值语句对三个指针的操作,理解很重要,切勿死记硬背!!
第一步:初始状态的指针位置
第二步:把head指针的位置复制给一个新的指针,即保存head指针的位置
第三步:head指针进行前移一个位置,即指向他原来的下一个位置
第四步:把q指针的下一个位置指向空,因为上一步head指针已经帮它记录下位置了
第五步:把q指针的位置赋值给p指针,因为上一步它的位置(是空位置)已经赋值(记录)给q.next了
第六步:把head指针的位置赋值给q,即要让q来保存head的位置,因为head指针又要前进了
第七步:head指针前进一步
第八步:实现反转,即把当前位置的指针的指向为它前一个位置
第九步:p指针继续跟着q指针前进一个(一共9步实现了head指针的前进)