1. 双链表求解法
双链表求解法是吧原链表的节点一个个摘掉,每次摘掉的节点都让他成为新链表的头节点,然后更新。用一些示意图展示一下
以此类推
function ReverseList(head)
{
let newHead = null;
while(head!=null){
let tmp = head.next;
head.next = newHead;
newHead = head;
head = tmp;
}
return newHead;
}
2.使用栈这种数据结构解决问题
先将链表全部入栈,再一个个出栈组成链表,这样就是逆序的了
function ReverseList(head)
{
let stack = []
while(head!=null){
stack.push(head)
head = head.next
}
if(stack.length ===0){
return null;
}
let node = stack.pop()
let dummy = node;
while(stack.length!==0){
let tmp = stack.pop()
node.next = tmp;
node = node.next;
}
//防止有环
node.next = null;
return dummy;
}
3.递归做法
通过递归遍历到尾节点 以尾节点为头,然后保存首节点的下一个节点,开始递归反向链接节点
function ReverseList(head)
{
if(head== null || head.next==null)
return head
let next = head.next
let reverseHead = ReverseList(next)
//head是本次递归调用传进来的节点 next是本次节点的下一个节点
// next.next逆序链接节点
next.next = head;
//head是尾节点 防止有环
head.next = null;
return reverseHead
}