反转链表

需求

写入一个函数,输入一个链表,反转链表后,输出新链表的表头

分析

输入的是一个链表,返回的是一个头节点

可以选择先遍历链表取出其中的值放入数组中,然后将数组的值倒序插入到链表里

或者不改变值而是改变链表的指向来达成目的

代码

遍历取值再更新

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
function ListNode(val) {
this.val = val;
this.next = null;
} //链表节点的构造函数
//给定一个数组来创建链表
function createList(arr) {
while (arr.length) {
let nodeval = arr.shift(); //节点的值
let head = new ListNode(nodeval);
head.next = createList(arr);
return head;
}
return null;
}
//反转链表
function reverseList(head){
let p = head;
let arr = [];
while(p){
arr.push(p.val); //依次存入链表节点的值
p = p.next;
}
p = head;
while(p){
p.val = arr.pop();
p = p.next;
}
return head;
}
let arr = [1,2,3,4,5,6,7,8];
let head = createList(arr);
console.log(reverseList(head));

改变指向

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function ListNode(val) {
this.val = val;
this.next = null;
} //链表节点的构造函数
//给定一个数组来创建链表
function createList(arr) {
while (arr.length) {
let nodeval = arr.shift(); //节点的值
let head = new ListNode(nodeval);
head.next = createList(arr);
return head;
}
return null;
}
function reverseList(head){
let p = null;
while(head){
let n = head.next; //存储下一个节点
head.next = p; //前面的节点与后面的节点断开
p = head; //p前移
head = n; //head后移
}
return p;
}

反转链表
https://blog-theta-ten.vercel.app/2021/08/19/反转链表/
作者
Chen
发布于
2021年8月19日
许可协议