1.移除重复节点
题目:编写代码,移除未排序链表中的重复节点。保留最开始出现的节点。
思路:用map记录出现过的节点
if (!head) return head;
const res = {
[head.val]:true
};
let resHead = head;
let cur = head;
head = head.next;
while (head) {
const next = head.next;
head.next = null;
if (!res[head.val]) {
res[head.val]=true;
cur.next = head;
cur=cur.next
}
head = next;
}
return resHead;
2.返回倒数第K个节点
题目:实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。
思路:快慢指针。两个指针一开始都指向头,一个指针先走K步,然后两个指针同时走知道快指针到节点末尾,此时慢指针指向的就是倒数第K个节点
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} head
* @param {number} k
* @return {number}
*/
var kthToLast = function(head, k) {
let slow = head;
let fast = head;
while (k--) {
fast = fast.next;
}
while (fast) {
slow = slow.next;
fast = fast.next;
}
return slow.val;
};
3.删除中间节点
题目:
实现一种算法,删除单向链表中间的某个节点(即不是第一个或最后一个节点),假定你只能访问该节点。
思路:参数是要删除的节点,那怎么弄?此时我们只知道后续节点,所以直接用下一个节点的值覆盖当前节点值,然后删除下一个节点即可
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} node
* @return {void} Do not return anything, modify node in-place instead.
*/
var deleteNode = function(node) {
node.val=node.next.val
node.next=node.next.next
};
4.回文链表
题目:编写一个函数,检查输入的链表是否是回文的。
思路:先用快慢指针,找到中间节点,然后反转后半段节点,比较前后两段节点即可
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} head
* @return {boolean}
*/
const reverse = (node) => {
let pre = null;
while (node) {
const next = node.next;
node.next = pre;
pre = node;
node = next;
}
return pre;
};
var isPalindrome = function (head) {
let slow = { next: head };
let fast = { next: head };
while (fast && fast.next) {
slow = slow.next;
fast = fast.next.next;
}
let right = reverse(slow.next);
while (right && head) {
if (right.val !== head.val) return false;
right = right.next;
head = head.next;
}
return true;
};
5.链表相交
题目:
给定两个(单向)链表,判定它们是否相交并返回交点。请注意相交的定义基于节点的引用,而不是基于节点的值。换句话说,如果一个链表的第k个节点与另一个链表的第j个节点是同一节点(引用完全相同),则这两个链表相交。
思路:假定链表1 = b+c,链表 2 = d+c,c就是它们相交的节点。所以b+c+d=d+c+b,两个指针先遍历一个链表,然后遍历另一个链表。如果有相交节点,那么两个指针相等的时候就是相交的节点。如果不相交,那么到最后都是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 prea = headA;
let preb = headB;
while (prea !== preb) {
prea = prea ? prea.next : headB;
preb = preb ? preb.next : headA;
}
return prea;
};