Leetcode206-reverseList翻转链表
Leetcode206-reverseList翻转链表
还是得多写博客才能让自己保持思考啊,不然都懒下去了
题目
题目链接
题目加上图片,含义显而易见:
![](https://img-blog.csdnimg.cn/2021040314554733.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzE3MDY1NTkx,size_16,color_FFFFFF,t_70)
截图来自Leetcode
思路
从前到后遍历链表,每次改变一个箭头的指向
1.最基本的操作是交换两个节点,这是循环体的主要功能
2.要保证能够把所有节点都进行两两交换,就必须保证后面的第三个节点还能被访问到,且能够正常结束,这是循环体的外围保障
复杂度
时间复杂度,从前到后遍历一次即完成操作,因此为
O
(
n
)
O(n)
O(n)
空间复杂度,没有新建链表,只是改变原节点的指向,
O
(
n
)
O(n)
O(n)
代码
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def reverseList(self, head: ListNode) -> ListNode:
# 单节点
if not head or not head.next:
return head
# 至少有两个节点
prev = head
node = head.next
head.next = None # head最终是尾节点,因此next为None
while node.next is not None:
tmp = node.next
# 反转指向
node.next = prev
# 指针前进
prev = node
node = tmp
# 循环跳出后,node是尾节点,prev是已经反转好的链表的头节点
node.next = prev
return node