这是剑指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