题目描述
解法
1. 使用队列
先遍历整个链表并用一个队列存储(append)node,然后使用pop的性质,先进去的后出来,更新到最后一个节点的next上。
class Solution:
def reverseList(self, head: ListNode) -> ListNode:
if head is None:
return None
deq = deque() #一个空队列
while head.next:
deq.append(head)
head = head.next
temp = head #指针停留在最后一个不为空的node上
while deq:
node = deq.pop() #每次弹出队列中最后一个node
# temp.next = node #这是我刚开始的思路,但是这样最后一个null的节点其实并没有被存储上,会变成了一个循环的链表,所以会超过时间限制
# temp = node
node.next = temp.next #每次都把最后一个节点null传递到下一个节点的next上
temp.next = node
temp = node
return head
时间复杂度为O(n),空间复杂度也是O(n)
2. 双指针
一个指向头部,另一个指向另一个链表的尾部
class Solution:
def reverseList(self, head: ListNode) -> ListNode:
if head is None:
return None
pre = head
res = None
while pre:
temp = ListNode(pre.val) #这里是把pre.val变成一个node,并且后面是没有next的,下一步重新定义next
temp.next = res # 1->null, 2->1->null
res = temp #这个相当于从尾部开始生成链表,这里是尾部,下一个循环的时候把这个尾部通过上面的next接上去了
pre = pre.next
return res
时间复杂度是O(n),空间复杂度是O(n),重新建立了一个链表
3.递归
class Solution:
def move_node(self,head,temp):
if head.next != temp:
temp = self.move_node(head.next,temp)
head.next = temp.next
temp.next = head
temp = head
return temp
def reverseList(self, head):
if head is None or head.next is None:
return head
temp = head
while temp.next:
temp = temp.next
#这时候temp指向了最后一个不为null的node
res = temp #重新定义的一个res原因是最后返回的应该是头节点,而tem最后会跑到尾节点
self.move_node(head,temp)
return res
递归的这种解法其实和第一个利用队列的思想是类似的,只不过没有利用队列存储,而是重新走了一遍该链表。
思考与感想
队列的方法最容易想出来,递归又臭又长。。。。。