算法与数据结构之LeetCode——反转一个单链表

反转一个单链表

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指针的前进)
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值