JS— 链表中倒数第K个节点和反转链表的三种解法

本文详细介绍了链表的基本操作,包括链表的创建、打印、查找倒数第K个节点及链表的反转。通过具体实例和代码实现,深入浅出地讲解了链表这一数据结构的使用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JS— 链表中倒数第K个节点和反转链表

(一)创建链表

这里创建一个简单的1>2>3>4>5>6的链表

let node1 = new Node(1);

let node2 = new Node(2);

let node3 = new Node(3);

let node4 = new Node(4);

let node5 = new Node(5);

let node6 = new Node(6);

node1.next = node2;

node2.next = node3;

node3.next = node4;

node4.next = node5;

node5.next = node6;

(二)打印链表

/**打印链表 */

function print(node) {

  let LList = [];

  let curNode = node;

  LList.push(curNode.val);

  while (curNode.next) {

​    LList.push(curNode.next.val);

​    curNode = curNode.next;

  }

  console.log(LList);

}

print(node1); 输出的结果为:

在这里插入图片描述

(三) 求链表中倒数第K个节点

function FindKthToTail(head, k) {

  if (!head || k <= 0) {   //首先进行安全判断,防止输入有误;return null;

  }

  let node = head;    //实际节点

  let kNode = head;    //控制节点

  for (let i = 1; i < k; i++) {    //实际节点要比控制节点往前K个距离if (kNode.next) {    

​      kNode = kNode.next;}else {return null;}

  }

  while (kNode.next) {    //当控制节点到达尾节点时,实际节点刚好是链表中倒数第k个节点

​    kNode = kNode.next;

​    node = node.next;

  }

  return node;

}

console.log(FindKthToTail(node1,2));

在这里插入图片描述

(四)反转链表

1、通过修改值来反转链表

//修改值

function ReverseList(pHead) {

  if (pHead == null) {    //安全判断return null;

  }

  let node = pHead;    

  let arr = [];

  while (node) {   //此次遍历是为了将链表中的值按顺序存进一个数组

​    arr.push(node.val);

​    node = node.next;

  }

  node = pHead;

  while (node) {   //此次遍历是为了将链表中的值进行反转

​    node.val = arr.pop();

​    node = node.next;

  }

  return pHead;

}

在这里插入图片描述

2、通过修改节点指向来反转链表(递归解法)

B>C的结构,用递归的思想,我们只关注一个节点,因为其他节点已经处理完成或者处理此个节点后就会处理。

当获取到一个B节点时,假设该节点后面的所有节点已经反转完毕,只需要将C的指向改为指向B即可,所以该解法的最重要的就是:

B.next.next = B;

/**修改节点指向(递归) */

function ReverseList(pHead)

{

  if (!pHead){return null;

  }

  let newNode = doReverse(pHead);

  pHead.next = null;

  return newNode;

}



function doReverse(node){

  let newHead = node;

  if (node.next){

​    newHead = doReverse(node.next);   

​    node.next.next = node;   //反转指向

  }

  else{

​    newHead = node;

  }

  return newHead;   //确保返回的节点都是最后一个节点,即反转后的头节点

}

在这里插入图片描述

3、通过修改节点指向来反转链表(非递归解法)

/**通过修改节点指向来反转链表(非递归解法) */

function ReverseList(pHead) {

  if (pHead == null) {    //安全判断return null;

  }

  let up = null;   //上一个

  let down = null;

  while (pHead) {

​    down = pHead.next;   //用来保存下一个节点

​    pHead.next = up;    //重建链表

​    up = pHead;   

​    pHead = down;

  }

  return up;

}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值