📜  用于链表顺时针旋转的Javascript程序(1)

📅  最后修改于: 2023-12-03 15:40:55.210000             🧑  作者: Mango

用于链表顺时针旋转的Javascript程序介绍

在Javascript中,链表是一种常见的数据结构,它由许多节点组成,每个节点包含一个值和指向下一个节点的指针。链表是动态的,意味着可以在运行时添加或删除节点。在某些应用程序中,需要对链表进行旋转,例如将链表的最后一个节点移动到链表的开头。本文将介绍如何使用Javascript旋转一个链表,其中包含以下内容:

  1. 链表数据结构
  2. 旋转链表的解决方案
  3. 代码实现和示例
链表数据结构

链表是一种按顺序排列的数据结构,具有以下特点:

  • 每个节点包含一个值和指向下一个节点的指针。
  • 链表的末尾节点指向null,这表示链表的结束。
  • 链表可以在运行时扩展。

以下是如何在Javascript中创建链表的示例代码:

class ListNode {
  constructor(val, next) {
    this.val = val;
    this.next = next;
  }
}

const node1  new ListNode(1);
const node2  new ListNode(2);
const node3  new ListNode(3);
const node4  new ListNode(4);
const node5  new ListNode(5);

node1.next = node2;
node2.next = node3;
node3.next = node4;
node4.next = node5;
node5.next = null;

在这个示例中,我们创建了一个包含5个节点的链表。每个节点都包含一个值和指向下一个节点的指针。链表的末尾节点指向null。

旋转链表的解决方案

我们将使用以下步骤来旋转链表:

  1. 计算链表的长度。
  2. 将链表的末尾节点与链表的头部相连。
  3. 从链表的头部开始遍历链表,直到遍历到新的链表末尾节点的前一个节点,即(length - k % length - 1)位置的节点。
  4. 将该节点的下一个节点作为新的链表头,将该节点的下一个节点设置为null,即切断旧链表和新链表的连接。
代码实现和示例

以下是用于链表顺时针旋转的Javascript程序的实现代码和示例:

function rotateRight(head, k) {
  if (!head || !head.next || k === 0) {
    return head;
  }

  let current = head;
  let length = 1;

  while (current.next !== null) {
    current = current.next;
    length++;
  }

  current.next = head;

  for (let i = 0; i < length - k % length - 1; i++) {
    head = head.next;
  }

  const newHead = head.next;

  head.next = null;

  return newHead;
}

const node1 = new ListNode(1);
const node2 = new ListNode(2);
const node3 = new ListNode(3);
const node4 = new ListNode(4);
const node5 = new ListNode(5);

node1.next = node2;
node2.next = node3;
node3.next = node4;
node4.next = node5;
node5.next = null;

rotateRight(node1, 2);

我们定义了一个rotateRight函数,该函数接受两个参数:链表的头节点和旋转次数k。如果链表或链表的下一个节点是null,或者k等于0,函数将返回链表本身。如果链表不为空,我们首先计算链表的长度,并将链表的末尾节点连接到链表的头部。然后,我们从链表的头部开始遍历链表,直到找到新的链表末尾节点的前一个节点,即(length - k % length - 1)位置的节点。将该节点的下一个节点作为新链表的头部,将该节点的下一个节点设置为null。最后,返回新链表的头节点。

我们使用以下示例进行测试:

const node1 = new ListNode(1);
const node2 = new ListNode(2);
const node3 = new ListNode(3);
const node4 = new ListNode(4);
const node5 = new ListNode(5);

node1.next = node2;
node2.next = node3;
node3.next = node4;
node4.next = node5;
node5.next = null;

rotateRight(node1, 2);

运行后,我们得到如下输出:

ListNode {
  val: 4,
  next: ListNode { val: 5, next: ListNode{ val: 1, next: ListNode{ val: 2, next: ListNode{ val: 3, next: null } } } }
}

该输出表示链表顺时针旋转2次后的结果为4->5->1->2->3。