Day4(連結串列)|24. 兩兩交換連結串列中的節點 & 19.刪除連結串列的倒數第N個節點 & 面試題 02.07. 連結串列相交 &142.環形連結串列II

flydandelion發表於2024-07-10

24. 兩兩交換連結串列中的節點

給你一個連結串列,兩兩交換其中相鄰的節點,並返回交換後連結串列的頭節點。你必須在不修改節點內部的值的情況下完成本題(即,只能進行節點交換)。

輸入:head = [1,2,3,4]
輸出:[2,1,4,3]

這題很簡單就不寫思路了

public ListNode swapPairs(ListNode head) {
        ListNode dummyNode = new ListNode();
        dummyNode.next = head;
        ListNode tmp = dummyNode;
        while(tmp.next!=null&&tmp.next.next!=null){
            ListNode next1 = tmp.next;
            ListNode next2 = tmp.next.next;

            tmp.next = next2;
            next1.next = next2.next;
            next2.next = next1;
            tmp = next1;
        }
        return dummyNode.next;
    }

19.刪除連結串列的倒數第N個節點

給你一個連結串列,刪除連結串列的倒數第 n 個結點,並且返回連結串列的頭結點。

輸入:head = [1,2,3,4,5], n = 2
輸出:[1,2,3,5]

思路 : 先把連結串列的長度size遍歷出來,然後找到size-n位置的節點,把這個節點刪除掉.為了把size-n位置的節點內容刪掉,我只能在開頭構建一個虛擬節點,這樣的話size-n找到的位置就是要刪除節點的前一個節點,這樣方便我做指標變化的刪除操作.綜合來說,此題也是簡單題.

程式碼如下:

public ListNode removeNthFromEnd(ListNode head, int n) {
        int size = getSize(head);
        int index = size - n;
        ListNode dummyNode = new ListNode(0,head);
        ListNode tmp = dummyNode;
        int i = 0;
        while(i!=index){
            tmp = tmp.next;
            i++;
        }
        tmp.next = tmp.next.next;
        return dummyNode.next;
    }

    public int getSize(ListNode head){
        int size = 0;
        while(head!=null){
            size++;
            head = head.next;
        }
        return size;
    }

面試題 02.07. 連結串列相交

此題目前認為官方題解有問題,還在研究中,暫不討論

142.環形連結串列II

給定一個連結串列的頭節點 head ,返回連結串列開始入環的第一個節點。 如果連結串列無環,則返回 null

如果連結串列中有某個節點,可以透過連續跟蹤 next 指標再次到達,則連結串列中存在環。 為了表示給定連結串列中的環,評測系統內部使用整數 pos 來表示連結串列尾連線到連結串列中的位置(索引從 0 開始)。如果 pos-1,則在該連結串列中沒有環。注意:pos 不作為引數進行傳遞,僅僅是為了標識連結串列的實際情況。

不允許修改 連結串列。

輸入:head = [3,2,0,-4], pos = 1
輸出:返回索引為 1 的連結串列節點
解釋:連結串列中有一個環,其尾部連線到第二個節點。

其實這道題用HashSet寫挺簡單的,HashSet全是優點,使用了陣列+Hashcode+連結串列+紅黑樹,追求極致效能,是基於陣列的實現.

ListNode index = head;
        Set<ListNode> visited = new HashSet<ListNode>();
        while(index!=null){
            if(visited.contains(index)){
                return index;
            }else{
                visited.add(index);
            }
            index = index.next;
        }
        return null;

相關文章