初級演算法-連結串列

方丈的寺院發表於2018-08-05

連結串列的刪除

這裡寫圖片描述

連結串列的刪除就是指標的移動,將待刪除節點的指標移動到下一個節點
題1:刪除某個連結串列中給定的(非末尾)節點,你將只被給定要求被刪除的節點。
雖然我們並不知道,這個節點的前一個節點時什麼,但是我們知道這個節點的下一個節點是什麼,
將當前要刪除的節點替換為下一個節點即可

public static void deleteNode(ListNode node) {
        if(node == null || node.next == null){
            return;
        }
        ListNode next = node.next;
        node.val = next.val;
        node.next = next.next;
    }

連結串列的反轉

題:反轉一個單連結串列
連結串列的反轉不需要不需要建立新的物件,整個過程也就是指標的移動
1. 首先構建一個新的節點,將頭結點與原來節點分離,然後重複前一個動作,將第二個節點從原來的節點分離,並加上新的節點上

這裡寫圖片描述

if(head == null || head.next == null) {
            return head;
        }
        // 新的節點
        ListNode pre = null;
        ListNode next = null;
        while (head != null) {
            // 首先儲存待移動節點的下一個節點
            next = head.next;
            // 分離當前節點,並指向新的節點
            head.next = pre;
            // 挪動新節點的指標
            pre = head;
            // 挪動舊節點指標
            head = next;
        }
        return pre;

連結串列的合併

題:兩個有序連結串列的合併
有序連結串列的合併,就是將另外一個連結串列的節點不斷插入另一個節點

這裡寫圖片描述

if(l1 == null || l2 ==null) {
            return l1 == null ? l2 : l1;
        }
        ListNode head = l1.val < l2.val ? l1 : l2;
        ListNode cur1 = head == l1 ? l1 : l2;
        ListNode cur2 = head == l1 ? l2 : l1;
        ListNode pre = null ;
        ListNode next = null;
        while(!(cur1 == null || cur2 == null)) {
            // 值比另外一個節點小,就直接遍歷下一個節點
            if (cur1.val <= cur2.val) {
                pre = cur1;
                cur1 = cur1.next;
            } else {
                // 將cur2的節點插入到cur1中
                next = cur2.next;
                pre.next = cur2;
                cur2.next = cur1;
                pre = cur2;
                cur2 = next;
            }
        }
        pre.next = cur1 == null ? cur2 : cur1;
        return head;

環形連結串列判斷

 if (head == null || head.next == null || head.next.next == null) {
            return false;
        }
        ListNode step1 = head;
        ListNode step2 = head;
        while (step2 != null && step2.next !=null) {
            step1 = step1.next;
            step2 = step2.next.next;
            if (step1 == step2) {
                return true;
            }
        }
        return false;

官方解答:
https://leetcode-cn.com/articles/linked-list-cycle/

相關文章