本篇文章是用JavaScript实现链表的生成以及链表的反转,不足的地方希望大家指出~
- 在此之前先来看一下
链表的定义吧: 链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 - 接下来提出我们的需求:写一个函数 , 输入一个链表 , 反转链表后 , 输出新链表的表头。
明确需求后就开始干啦,具体实现代码如下
- 创建链表的节点:在js里面可以用构造函数来创建列表的节点
function Node(val){
this.value = val;
this.next = null;
}
- 首先需要新建链表的方法
function createList(arr) {
let head = new Node(arr[0]);
let tail = head;
for (let i = 1; i <= arr.length - 1; i++) {
tail.next = new Node(arr[i]);
tail = tail.next;
}
return head;
}
- 生成链表
let linkedList = createList([1, 2, 3, 4, 5])
看一下生成的链表结构
- 反转链表的方法
function reverseList(head) {
// 1.遍历链表,把链表里面的每个值都拿下来并缓存
// (在这里我存的节点的值,而不是存整个节点,这样是可以节约内存的)
let arr = []; //arr用于储存链表的节点的值
let p = head; //p用于遍历链表
while (p) {
arr.push(p.value);
p = p.next;
}
// 2.再次遍历列表,将数组里面的值倒序的赋值给每一个节点的value域就实现了链表的反转
// (这里我并没有考虑新建一个链表,而是用了原来的链表,可以节约创建新链表的时间和内存)
p = head;
while (p) {
p.value = arr.pop();
p = p.next;
}
return head;
}
- 反转链表
let reservesLinkedList = reverseList(list);
反转后链表的结构
以上.