剑指offer之反转链表

170 阅读1分钟

题目要求--反转链表,将链表中的所有指向反转

原文链接点这里

方法一:回溯法

解题思路:题目中涉及反转 从尾到头 颠倒都要思考是否可以用 回溯来解决,利用好先进后出的特点,而回溯本质上就是先进后出.

代码如下:

var reverseList = function(head) {
let res=new ListNode(null)
function back(node,lnode){   //回溯函数
if(node==null){
res=lnode
return
}
back(node.next,node)
node.next=lnode
}
back(head,null)     //调用回溯函数
return res

解题总结:回溯三部曲 边界条件-->调用函数进入回溯-->CRUD

方法二:双指针

解题思路:通过双指针在遍历链表时改变方向,重点在于存储下一个节点

代码如下:

var reverseList = function(head) {
//1.双指针
//2.依次遍历·
//3.存储下一节点
let cur=head
let pre=null
while(cur){
let next=cur.next   //存储下一个节点,以免改变cur的指针指向后找不到
cur.next=pre        //改变cur指向   反转
pre=cur             //将cur和pre向前移动一位
cur=next
}
return pre
}

解题总结:重点在于存储下一个节点