赞
踩
反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-linked-list/
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
定义三个游标,p
,q
,r
。
1->2->3->4->5->NULL
^ ^ ^
p q r
进行一下几个步骤:
p.next = None
r is not None
时,反转p
,q
,即令q.next = p
r is None
,表示p
,q
,r
已经走到链表的末尾,进行最后一个p
,q
的反转返回q即可在三个游标中r
游标起引路作用,不至于在反转过程中找不到余下的链表。
复杂度:
核心代码:
# Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.val = x # self.next = None class Solution: def reverseList(self, head: ListNode) -> ListNode: if head is None or head.next is None: return head p = None q = head r = head.next while r is not None: # reverse q.next = p # 前进 p,q,r = q,r,r.next # r is None,走到最后 q.next = p return q
思路:
将链表:
n
1
→
n
2
→
.
.
.
→
n
k
→
n
k
+
1
→
n
k
+
2
→
.
.
.
→
n
m
n_1 \to n_2 \to ... \to n_{k} \to n_{k+1} \to n_{k+2} \to ... \to n_m
n1→n2→...→nk→nk+1→nk+2→...→nm
以
n
k
n_{k}
nk之后为界限将链表看成两部分,令head = n_k
,则之后的部分调用递归调用reverseList(head.next)
可以完成反转,反转之后如下:
n
1
→
n
2
→
.
.
.
→
n
k
→
n
k
+
1
←
n
k
+
2
←
.
.
.
←
n
m
n_1 \to n_2 \to ... \to n_{k} \to n_{k+1} \gets n_{k+2} \gets ... \gets n_m
n1→n2→...→nk→nk+1←nk+2←...←nm
并返回一个
n
k
n_{k}
nk之后节点反转之后的新的头结点即
n
m
n_m
nm。
则当前要考虑的就是怎么把
n
k
n_k
nk纳入进来,很简单,只需将head.next
节点的下一个节点指向head节点即可反转
n
k
n_k
nk,
n
k
+
1
n_{k+1}
nk+1之间的指向关系。即head.next.next = head
。
由于当前head
连接上head
之后的反转链表,并且反转之后,head
节点在新链表的最后一个节点,因此要添加head.netx = None
标志当前链表的结束。
**复杂度:**时间和空间复杂度都为
O
(
n
)
O(n)
O(n)。
核心代码:
# Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.val = x # self.next = None class Solution: def reverseList(self, head: ListNode) -> ListNode: if head is None or head.next is None: return head # 反转当前节点之后的链表 new_head = self.reverseList(head.next) # 拼接当前节点和之后的已经反转好的链表, head.next.next = head # 翻转以后当前head节点为最后的有效节点,应该添加最后的None标志链表结束 head.next = None return new_head
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。