一、题目描述
反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
进阶:
你可以迭代或递归反转链表。
你能否用两种方法解决这道问题?
二、思路分析
反转两个节点
如果一开始就考虑长链表的反转就很难。
所以我们先来考虑只拥有两个节点的链表如何反转,这是不是就简单多了?
示例:
输入: ...-> n -> n+1 ->...
输出: ...-> n+1 -> n ->...
反转两个节点:
只需要将节点 n+1 的 next 指向 n 即可。
反转多个节点
那么如何反转多个节点呢?
实际上只需要不断的重复上述的 反转两个节点 的操作即可。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
解题步骤
- 使用双指针遍历链表,两个指针一前一后;
- 在遍历链表的过程中,不断的反转双指针 示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
// ----- 1
1 2
^ ^
1->2->3->4->5->NULL
// ----- 2
1 2
^ ^
2->1->NULL 3->4->5->NULL
// ----- 3
1 2
^ ^
3->2->1->NULL 4->5->NULL
// ----- 4
1 2
^ ^
4->3->2->1->NULL 5->NULL
// ----- 5
1 2
^ ^
5->4->3->2->1->NULL NULL
三、AC 代码
迭代算法
var reverseList = function(head) {
let p1 = null
let p2 = head
while(p2) {
let temp = p2.next
p2.next = p1
p1 = p2
p2 = temp
}
console.log(p1)
return p1
}
递归算法
var reverseList = function(node, next = null) {
if(!node) return null
const nodeNext = node.next
node.next = next
if(nodeNext) {
return reverseList(nodeNext, node)
}
return node
}
四、总结
这道题其实很简单的,但是如果一开始就考虑长链表的转换的话就会很复杂甚至会懵,所以考虑问题的时候不要把问题想的太复杂,把问题分化成一个又一个的小问题即可分而治之。
主要考点就是链表的遍历和对链表结构的理解。
本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情