206、Reverse Linked List反转链表
难度:简单
题目描述
英文:
Reverse a singly linked list.
中文:
反转一个单链表。
示例
Example:
1
2Input: 1->2->3->4->5->NULL
Output: 5->4->3->2->1->NULL进阶
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
解题思路
递归解决方法的视频讲解
Reverse a Linked List Recursively
思路一
参考讨论区的一种做法。
时间复杂度O(N),空间复杂度O(1)
这里给出两种方法:迭代法(循环),递归方法。
两种方法的思路都是一样的。如下所示
…<-x<-x<-x<-x<-pre || cur->y->y->y->y…
- 将整个链表分成两个部分;前半部分链表,后半部分链表
- pre为已经 反转 好的部分链表的头节点;
- cur为当前仍然没有反转部分链表的头节点;
- 我们当前需要做的事情就是将cur节点加入到前半部分的链表中,
直到右边的链表全部加入到左边的链表中即可。 - 用递归的思想理解4很容易。
代码提交
递归方法
C++,用时8ms,内存9M
1 | /** |
迭代方法
C++,用时8ms,内存9.1M
1 | /** |
思路二
参考LeetCode上递归
探索页给出的解决方案。
递归版,是从后往前来转变链表指针的方向;迭代版是从前往后来转变链表的方向。
代码提交
1 | /** |
思路三
参考网上的解法,巧妙利用Python的多元赋值,实现非常简洁。
具体的执行过程可参考下面的举例说明:
前置条件:迭代指针:p = head、结果指针:res = none
以1->2->3->4->5为例:
过程:
res:None
第一层循环
res:1->2->3->4->5 res = p
res:1->None res.next = res
p:2->3->4->5 p = p.next
第二层循环
res:2->3->4->5 res = p
res:2->1->None res.next = res
p:3->4->5 p = p.next
第三层循环
res:3->4->5 res = p
res:3->2->1->None res.next = res
p:4->5 p = p.next
第四层循环
res:4->5 res = p
res:4->3->2->1->None res.next = res
p:5 p = p.next
第五层循环
res:5 res = p
res:5->4->3->2->1->None res.next = res
p:None p = p.next
end…
代码提交
Python,用时32ms,内存12.7M
1 | # Definition for singly-linked list. |