日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Day22——十字链表

發(fā)布時間:2023/12/10 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Day22——十字链表 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

十字鏈表相對比鄰接表難一點(diǎn),相較而言,十字鏈表的結(jié)點(diǎn)比鄰接表多了一個指針域用來鏈接指向該“頭”結(jié)點(diǎn)的其它結(jié)點(diǎn)。
如何實現(xiàn)十字鏈表,我們可以從實現(xiàn)鄰接表找突破口,因為實現(xiàn)鄰接表就確定了各個結(jié)點(diǎn)的nextOut值,接下來我們只需要確定各個結(jié)點(diǎn)的nextIn。
1:確定各個頂點(diǎn)的nextOut:按行遍歷鄰接矩陣,創(chuàng)建以當(dāng)前行結(jié)點(diǎn)為起點(diǎn)的邊結(jié)點(diǎn)對象并確定nextOut值:

對應(yīng)代碼:

for (int i = 0; i < numNodes; i++) {headers[i] = new OrthogonalNode(i, -1);tempPreviousNode = headers[i];for (int j = 0; j < numNodes; j++) {if (paraMatrix[i][j] != 0) {// Create a new node.tempNode = new OrthogonalNode(i, j);// LinktempPreviousNode.nextOut = tempNode;tempPreviousNode = tempNode;} // Of if} // Of for j} // Of for i

2:確定每個頂點(diǎn)的nextIn:遍歷每個邊結(jié)點(diǎn),每個邊結(jié)點(diǎn)的column值說明了該column對應(yīng)的結(jié)點(diǎn)的nextIn應(yīng)該指向當(dāng)前邊結(jié)點(diǎn),但需要注意的是,我們只能第一次通過column從header數(shù)組里面找到對應(yīng)結(jié)點(diǎn),如果當(dāng)前column結(jié)點(diǎn)的入度大于1,則需要遍歷當(dāng)前結(jié)點(diǎn)nextIn所指向的鏈表,直到遍歷到結(jié)點(diǎn)的nextIn為空時再賦值(除非我們用頭插法)。為了避免遍歷尋找需要插入nextIn的結(jié)點(diǎn),可以為每個頂點(diǎn)設(shè)置臨時指針,該指針指向當(dāng)前應(yīng)該插入nextIn的結(jié)點(diǎn),插入后更新,初始值為頂點(diǎn)結(jié)點(diǎn),使用空間換時間。

為每個頂點(diǎn)設(shè)置臨時指針的作用:

確定各個結(jié)點(diǎn)的nextIn。

對應(yīng)代碼:

OrthogonalNode[] tempColumnNodes = new OrthogonalNode[numNodes];for (int i = 0; i < numNodes; i++) {tempColumnNodes[i] = headers[i];} // Of for ifor (int i = 0; i < numNodes; i++) {tempNode = headers[i].nextOut;while (tempNode != null) {tempColumnNodes[tempNode.column].nextIn = tempNode;tempColumnNodes[tempNode.column] = tempNode;tempNode = tempNode.nextOut;} // Of while} // Of for i

完整代碼:

package day22;public class OrthogonalList {/*** An inner class for adjacent node.*/class OrthogonalNode {/*** The row index.*/int row;/*** The column index.*/int column;/*** The next out node.*/OrthogonalNode nextOut;/*** The next in node.*/OrthogonalNode nextIn;/*** ********************** The first constructor.* * @param paraRow The row.* @param paraColumn The column.***********************/public OrthogonalNode(int paraRow, int paraColumn) {row = paraRow;column = paraColumn;nextIn = null;nextOut = null;}// Of OrthogonalNode}// Of class OrthogonalNode/*** The number of nodes. This member variable may be redundant since it is always* equal to headers.length.*/int numNodes;/*** The headers for each row.*/OrthogonalNode[] headers;/*** ********************** The first constructor.* * @param paraMatrix The matrix indicating the graph.***********************/public OrthogonalList(int[][] paraMatrix) {numNodes = paraMatrix.length;// Step 1. Initialize. The data in the headers are not meaningful.OrthogonalNode tempPreviousNode, tempNode;headers = new OrthogonalNode[numNodes];// Step 2. Link to its out nodes.for (int i = 0; i < numNodes; i++) {headers[i] = new OrthogonalNode(i, -1);tempPreviousNode = headers[i];for (int j = 0; j < numNodes; j++) {if (paraMatrix[i][j] != 0) {// Create a new node.tempNode = new OrthogonalNode(i, j);// LinktempPreviousNode.nextOut = tempNode;tempPreviousNode = tempNode;} // Of if} // Of for j} // Of for i// Step 3. Link to its in nodes.OrthogonalNode[] tempColumnNodes = new OrthogonalNode[numNodes];for (int i = 0; i < numNodes; i++) {tempColumnNodes[i] = headers[i];} // Of for ifor (int i = 0; i < numNodes; i++) {tempNode = headers[i].nextOut;while (tempNode != null) {tempColumnNodes[tempNode.column].nextIn = tempNode;tempColumnNodes[tempNode.column] = tempNode;tempNode = tempNode.nextOut;} // Of while} // Of for i}// Of OrthogonalList/************************ Overrides the method claimed in Object, the superclass of any class.**********************/public String toString() {String resultString = "Out arcs: \r\n";OrthogonalNode temNode;for (int i = 0; i < numNodes; i++) {temNode = headers[i].nextOut;while (temNode != null) {resultString += "(" + temNode.row + "," + temNode.column + ") ";temNode = temNode.nextOut;} // Of whileif (headers[i].nextOut != null) {resultString += "\r\n";} // Of if} // Of for i;resultString += "In arcs: \r\n";for (int i = 0; i < numNodes; i++) {temNode = headers[i].nextIn;while (temNode != null) {resultString += "(" + temNode.row + "," + temNode.column + ") ";temNode = temNode.nextIn;} // Of whileif (headers[i].nextIn != null) {resultString += "\r\n";} // Of if} // Of for i;return resultString;}// Of toString/*** ********************** @Title: main* @Description: TODO(The entrance of the program.)** @param argsn Not used now.***********************/public static void main(String args[]) {// int[][] tempMatrix = { { 0, 1, 0, 0 }, { 0, 0, 0, 1 }, { 1, 0, 0, 0 }, { 0,// 1, 1, 0 } };int[][] tempMatrix = { { 0, 1, 1, 0 }, { 0, 0, 0, 0 }, { 1, 0, 0, 1 }, { 1, 1, 1, 0 } };OrthogonalList tempList = new OrthogonalList(tempMatrix);System.out.println("The data are:\r\n" + tempList);}// Of main}// Of class OrthogonalList

運(yùn)行結(jié)果:

總結(jié)

以上是生活随笔為你收集整理的Day22——十字链表的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。