逆轉交替合并兩個鏈表,逆轉交替合并

來源:互聯網
上載者:User

逆轉交替合并兩個鏈表,逆轉交替合并

一、問題描述

鏈表A和B

A: 1->2->3->4

B: a->b->c->d

請逆轉交替合并兩個鏈表,樣本結果如下:

4->d->3->c->2->b->1->a

節點類型定義如下:

classNode {

    public Node next;

    ...

}


二、原始碼:

傳入兩個A和B鏈表,返回處理後的鏈表:

Node reverse_merge(Node A, Node B) {//A、B都只有一個節點if(A.next==null){A.next=B;return A;}//A、B都大於等於2個節點Node nextA;Node nextB;nextB = B.next;B.next = null;nextA = A.next;A.next = B;B = nextB;while (nextA.next != null)        {B.next = A;A = nextA;nextA = A.next;A.next = B;B = nextB;}nextB.next = A;nextA.next = B;return nextA;}



三、解析:

程式分成三個部分——while迴圈之前、while迴圈體、while迴圈之後。

1)處理之前的鏈表A和B


2)while迴圈——核心的處理部分

這裡處理常式的可重複的部分,我們的目標是紅色的部分,要達成紅色的連結模式,有兩個原子結構:深紅色圓圈1和藍色圓圈2


但是1中需要特別處理a所在的節點,僅對於a所在的節點需要一個next=null的操作,也就是說1中的第一個原子要放在迴圈之外實現,這包括1指向a,b指向1的操作。

換種方式,如果使用2方式,就只需要將1指向a放在迴圈之外。所以,這裡採用了2中描述的原子結構。


原子結構需要的資訊

當我們進行到某一次迴圈時,假設進行到藍色圓圈的操作了,這時候我們鏈表的狀態為:


更為直觀的畫法為:


它涉及到3個節點——2,3和c。其中紅色部分是我們希望做到的連結方式。為了連結c->2,3->c,必須知道有相應的指標記錄他們的位置。所以在迴圈之前我們需要掌握這三個元素的地址,並且在處理完之後,用相同的方式表示下一次需要處理的原子結構。

例如以下這種方式記錄這次迴圈中設計的3個節點的地址:


A、nA、B代表指向相應節點的指標或者說是引用。

在處理完成之後需要用相同的方式記錄下一次原子結構涉及的節點,這樣才能保證迴圈能夠按統一邏輯執行下去,我們的目標是:


這些賦值操作正是迴圈體的中代碼所做的事情,恰好代碼也是按照上面指定的命名形式,有一點區別,圖中的nA代表代碼中的nextA。除此之外,代碼中定義了nextB作為一個中間變數,用來記錄c->d斷開之前d節點的地址,因為c指向2之後就會失去對d的聯絡,這個中間變數是必須的。

3)while迴圈之前——解決預備操作所帶來的問題

我們還沒有處理a節點,因為它太特殊了,沒有合適的原子結構能包括它。所以我們把它放在迴圈體之外,並且為迴圈做好準備工作,我們希望的結果是這樣:


在這之後我們就可以把1,2,b放在迴圈體中處理。這裡也考慮了A、B都只有一個節點的情況,也需要單獨處理。


4)while迴圈之後——最後的處理

當我們發現B鏈表到達末尾時,結束迴圈。但這時候並有處理末尾節點,換句話說,末尾節點不在原子結構中。我們的迴圈會停止在這個原子結構中:


作為最後的操作,我們需要手動處理d->3,4->d的連結步驟——這也是沒有辦法的,因為原子結構的處理必須找到能夠把所有指標傳遞下去的節點,作為最後的節點是沒辦法吧指標繼續傳遞下去。


這不是一個完整的方法,還有很多事情沒有處理,比如輸入的A、B如果不等長,應該如何處理。另外Node資料結構並沒有完整的定義,不過這都不是本文討論的重點。

著作權聲明:隨意評論。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.