📅  最后修改于: 2023-12-03 15:11:29.337000             🧑  作者: Mango
链表是数据结构中常见的一种,Hackerrank上有很多与链表相关的问题。在这篇文章中,我们将会探讨一些更高级的链表问题,并提供解决方案。
问题描述:给定一个链表和一个整数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指针指向原先的头节点。最后我们返回新的头节点即可。
问题描述:给定两个链表,判断它们是否相交。如果相交,返回相交节点。否则,返回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,两个指针会在相交节点处相遇。
问题描述:把一个链表按奇数偶数重新排列。
/**
* 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指针来解决。我们把奇数节点和偶数节点分开,最后把偶数链表连接到奇数链表的尾部即可。