链表加强练习篇

113 阅读1分钟

单链表反转

链接:leetcode-cn.com/problems/re…

我的思路及题解:

截屏2022-01-02 下午9.17.07.png

const reverseList = function(head) {
    // 特殊情况处理
    if(!head || !head.next) return head;
    let p = head;
    let cur = head.next;
    let next = cur.next;
    head.next = null;
    while(cur) {
        // 翻转链表
        cur.next = p;
        p = cur;
        cur = next;
        if(!cur) return p; // 翻转完成
        next = next.next;
    }
    return cur;
};

优化一波

const reverseList = function(head) {
    // 特殊情况处理
    if(!head || !head.next) return head;
    let p = head;
    let cur = head.next;
    head.next = null;
    while(cur) {
        // 翻转链表
        const next = cur.next;
        cur.next = p;
        p = cur;
        cur = next;
    }
    return p;
};

链表中环的检测

链接(简单):leetcode-cn.com/problems/li…
思路及题解

截屏2022-01-03 下午11.11.17.png

var hasCycle = function(head) {
    if(!head) return false;
    let p = head;
    let p2 = head;
    while(p2.next){
        p = p.next;
        if(p2.next&&p2.next.next) {
            p2 = p2.next.next;
        }else{
            return false;
        }
        // 两个指针相遇 链表存在环
        if(p === p2) return true;
    }
    return false;
};

链接(中等):leetcode-cn.com/problems/li…
思路及题解

截屏2022-01-05 下午11.06.30.png

var detectCycle = function(head) {
    if(!head || !head.next) return null;
    let p = head;
    let p2 = head;
    while(p2.next && p2.next.next) {
        p = p.next;
        p2 = p2.next.next;
        // 找到两个指针相遇的位置
        if(p2 === p) { 
            p = head;
            // 两指针同时向后遍历,相遇即为入环结点
            while(p !== p2) {
                p = p.next;
                p2 = p2.next;
            }
            return p;
        }
    }
    return null
};

合并链表

链接: leetcode-cn.com/problems/me…

思路:每次取所有链表中最小的值拼接到新的链表中 题解:

var mergeKLists = function(lists) {
    let newlist = new ListNode(null,null);
    let p = newlist;
    while(hasNode(lists)){
        let [min,i] = getSmall(lists);
        p.next = min;
        p = min;
        lists[i] = min.next;
    }
    return newlist.next
    
    // 判断链表数组中是否还有元素
    function hasNode(lists){
        for(let i = 0;i<lists.length; i++){
            if(lists[i]) return true
        }
        return false
    }
    // 获取最小值
    function getSmall(lists) {
        let min = {
            val:Infinity
        };
        let index = -1;
        for(let i = 0;i<lists.length;i++){
            if(lists[i] && lists[i].val < min.val){
                min = lists[i];
                index = i;
            }
        }
        return [min,index];
    }
};

删除链表倒数第n个结点

链接:leetcode-cn.com/problems/re…
思路及题解

截屏2022-01-09 下午5.51.03.png

function removeNthFromEnd(head: ListNode | null, n: number): ListNode | null {
    if(!head) return null;
    let tail = new ListNode(null,head);
    let p = head;
    let result = tail;
    while(p){
        p = p.next;
        n--;
         if(n < 0) {
            result = result.next; 
        }
    }
    result.next = result.next.next;
    return tail.next;
};