输入一个链表,反转链表后,输出新链表的表头-python解法

输入一个链表,反转链表后,输出新链表的表头-python解法


这是剑指offer的链表题目,涉及到链表的基本知识和链表的反转。

链表基础知识

链表的基本结构

链表是通过一个个节点组成的,每个节点都包含了称为cargo的基本单元,它也是一种递归的数据结构。它能保持数据之间的逻辑顺序,但存储空间不必按照顺序存储。
如图:
单链表结构

链表的基本元素有:

  • 节点:每个节点有两个部分,左边部分称为值域,用来存放用户数据;右边部分称为指针域,用来存放指向下一个元素的指针。
  • head:head节点永远指向第一个节点
  • tail: tail永远指向最后一个节点
  • None:链表中最后一个节点的指针域为None值

以上内容为基础知识,具体可以参考这篇博客


反转链表

因为链表是有head和tail,而他们是有一个方向的,因此我们想直接进行类似list[::-1]这种反转就不是太方便。在下面的算法中,我们通过将链表截断,而后再拼接的方式进行反转。

以{1,2,3}链表作为例子,来说明下面算法中while迭代的流程(手工debug…)

1.将{2,3}的地址指向给tmp
2.将last=None指向pHead.next,这个时候pHead链表就被截断了,pHead只剩下了1,因为他的下一步指向了None
3.将此时的pHead,也就是1指向给last,这时候last为{1}
4.将tmp={2,3}指向给pHead,此时这轮迭代结束,开启下一轮.
这时,pHead是{2,3},last是{1}


5.将{3}指向给tmp
6.将{1}指向给pHead.next,也就是2的下一步值,因此这时候pHead就变成了{2,1}
7.将{2,1}指向给last
8.将{3}指向给pHead,此时这轮迭代结束,开启下一轮.
这时,pHead是{3},last是{2,1}


9.将None指向了tmp
10.将{2,1}指向给pHead.next,也就是{3}的下一步值,这个时候pHead就变成了{3,2,1}
11.将{3,2,1}指向给last
12.将None指向给pHead,此时这轮迭代结束,while迭代结束。
这时pHead是{None},last是{3,2,1}

这里最重要的是每次迭代中的第二步骤,也就是把链表截断的步骤。

# -*- coding:utf-8 -*-
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
class Solution:
    # 返回ListNode
    def ReverseList(self, pHead):
        # write code here
        if not pHead or not pHead.next:
            return pHead
        
        last =None
        
        while pHead:
            tmp = pHead.next#将下一步的地址指向给tmp
            pHead.next=last#将一个新的链表指向给旧链表pHead,这个时候就把pHead截断了,只剩下前面的链表值
            last=pHead#将旧链表的地址指向给新链表
            pHead=tmp#将旧链表原来的下一步只指向给pHead
        return last

参考

https://blog.csdn.net/qq_39422642/article/details/78988976
https://baike.baidu.com/item/链表/9794473?fr=aladdin

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章