📌  相关文章
📜  第 24 天:更多链表hackerrank 解决方案 javascript (1)

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

第 24 天:更多链表Hackerrank解决方案 JavaScript

链表是数据结构中常见的一种,Hackerrank上有很多与链表相关的问题。在这篇文章中,我们将会探讨一些更高级的链表问题,并提供解决方案。

问题1:旋转链表

问题描述:给定一个链表和一个整数k,将链表向右旋转k个位置。

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} head
 * @param {number} k
 * @return {ListNode}
 */
var rotateRight = function(head, k) {
    if (!head || !head.next) return head;
    let len = 1, cur = head;
    while (cur.next) {
        len++;
        cur = cur.next;
    }
    let mod = k % len;
    if (mod === 0) return head;
    let slow = head, fast = head;
    for (let i = 0; i < mod; i++) {
        fast = fast.next;
    }
    while (fast.next) {
        slow = slow.next;
        fast = fast.next;
    }
    let newHead = slow.next;
    slow.next = null;
    fast.next = head;
    return newHead;
};

这是一个比较容易的问题。我们需要先找出链表的长度len,然后遍历链表找到链表的尾端节点。接着我们找到需要旋转到节点的前一个节点,把前一个节点的next指针置为null并把尾节点的next指针指向原先的头节点。最后我们返回新的头节点即可。

问题2:交叉链表

问题描述:给定两个链表,判断它们是否相交。如果相交,返回相交节点。否则,返回null。

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} headA
 * @param {ListNode} headB
 * @return {ListNode}
 */
var getIntersectionNode = function(headA, headB) {
    let a = headA, b = headB;
    while (a !== b) {
        a = a ? a.next : headB;
        b = b ? b.next : headA;
    }
    return a;
};

这个问题可以使用快慢指针来解决。我们先用一个指针遍历完链表A、B之和,然后用另一个指针遍历链表A、B,两个指针会在相交节点处相遇。

问题3:奇偶链表

问题描述:把一个链表按奇数偶数重新排列。

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} head
 * @return {ListNode}
 */
var oddEvenList = function(head) {
    if (!head || !head.next) return head;
    let odd = head, even = head.next, evenHead = even;
    while (even && even.next) {
        odd.next = even.next;
        odd = odd.next;
        even.next = odd.next;
        even = even.next;
    }
    odd.next = evenHead;
    return head;
};

这个问题可以通过遍历链表,并更改节点的next指针来解决。我们把奇数节点和偶数节点分开,最后把偶数链表连接到奇数链表的尾部即可。