leetcode 206、203、328、234链表经典题

技巧

1. 通过一些测试用例可以节省您的时间。

使用链表时不易调试。因此,在编写代码之前,自己尝试几个不同的示例来验证您的算法总是很有用的。

 

2. 你可以同时使用多个指针。

有时,当你为链表问题设计算法时,可能需要同时跟踪多个结点。您应该记住需要跟踪哪些结点,并且可以自由地使用几个不同的结点指针来同时跟踪这些结点。

如果你使用多个指针,最好为它们指定适当的名称,以防将来必须调试或检查代码。

 

3. 在许多情况下,你需要跟踪当前结点的前一个结点。

你无法追溯单链表中的前一个结点。因此,您不仅要存储当前结点,还要存储前一个结点。这在双链表中是不同的

206. 反转链表

var reverseList = function(head) {
    let prev = null;
    let cur = head;
    while(cur){
        let temp = cur.next;
        cur.next = prev;
        prev = cur;
        cur = temp;
    }
    return prev;
};

 

203. 移除链表元素

var removeElements = function(head, val) {
    const dummyhead = new ListNode(0, head);
    let cur = dummyhead;
    while(cur.next) {
        if(cur.next.val === val) {
            cur.next =  cur.next.next;
            continue;
        }
        cur = cur.next;
    }
    return dummyhead.next;
};

 

328. 奇偶链表

var oddEvenList = function(head) {
    if(!head) return head;
    let odd = head;// 扫描奇数结点
    let even = head.next;// 扫描偶数结点
    let evenHead = even;// 保存偶链的头结点
    while(even != null && even.next != null){
        odd.next = even.next;// even.next是下一个奇数结点
        odd = odd.next;// odd 推进到下一个奇数结点\
        even.next = odd.next;// 下一个奇数结点的next是下一个偶数结点
        even = even.next;// even 推进到下一个偶数结点
    }
    odd.next = evenHead;// 奇链连上偶链
    return head;
};

 

234. 回文链表

var isPalindrome = function(head) {
    if(!head || !head.next) return true;
    let fast = head, slow = head;
    let prev;
    while(fast && fast.next){
        prev = slow;
        slow = slow.next;
        fast = fast.next.next;
    }
    prev.next = null;// 断成两个链表
    // 翻转后半段
    let head2 = null;
    while(slow){
        const temp = slow.next;
        slow.next = head2;
        head2 = slow;
        slow = temp;
    }
    // 比对
    while(head && head2){
        if(head.val != head2.val){
            return false;
        }
        head = head.next;
        head2 = head2.next;
    }
    return true;
};

 

posted @ 2021-09-22 17:23  jerryfish  阅读(34)  评论(0编辑  收藏  举报