一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - 逆轉交替合并兩個鏈表的解析與實現

逆轉交替合并兩個鏈表的解析與實現

2019-12-27 12:58賢狼羅蘭斯 JAVA教程

本篇文章主要介紹了將兩個鏈表逆轉交替合并的實現思路與方法,需要的朋友可以參考下

逆轉交替合并兩個鏈表,即從一個鏈表的尾指針指向另一個鏈表的尾指針,依次逆轉交替進行合并。下面就通過實例來詳細的介紹該逆轉交替合并兩個鏈表的思路與實現代碼。

一、問題描述

鏈表A和B
A: 1->2->3->4
B: a->b->c->d
請逆轉交替合并兩個鏈表,示例結果如下:
4->d->3->c->2->b->1->a
節點類型定義如下:

?
1
2
3
4
classNode {
 public Node next;
 ...
}

二、源代碼:

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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數據結構并沒有完整的定義,不過這都不是本文討論的重點。

通過以上詳細的解析,希望能夠幫助大家很好的理解該逆轉交替合并兩個鏈表的方法與實現。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: freefron性中国国产高清 | 日本视频在线观看 | 美女翘臀跪床被打屁股作文 | 国产成人99久久亚洲综合精品 | 国产成人精品视频午夜 | 国产在线极品 | 欧美高清在线精品一区二区不卡 | 娇喘嗯嗯 轻点啊视频福利 九九九九在线精品免费视频 | 成人性色生活片免费网 | sex5·性屋娱乐 | 亚洲第一综合网 | 明星h文集合短篇小说 | 电车痴汉(han)| 日本在线看 | 国产欧美日韩在线观看精品 | 美味情缘韩国在线观看视频 | 欧美高清在线不卡免费观看 | 日韩伦理在线免费观看 | 67id人成观看免费 | 波多野结衣中文字幕在线 | 美女隐私部位视频网站 | 加勒比久草| 视频网站入口在线看 | 日产免费自线一二区 | 91制片厂制作果冻传媒2021 | 日韩一区二区三区在线 | 日本暖暖在线视频 | 91精品婷婷国产综合久久8 | 成年女人毛片免费观看97 | gayrb漫画免费入口 | 99热这里只有精品免费 | 袖珍人与大黑人性视频 | 视频在线观看国产 | 天天综合色天天综合 | 亚洲a图 | porno xxxx日本| 国产精品毛片久久久久久久 | 美女扒开屁股让我桶免费 | 精品四虎| 国产免费精彩视频 | 精品国产免费第一区二区三区日韩 |