分析過程:
首先需要比較待添加的節(jié)點編號與已有的節(jié)點編號的大小,若待添加的節(jié)點編號已經(jīng)存在,則不能加入。為防止出現(xiàn)空指針的情況,需要對節(jié)點的位置進(jìn)行判斷。
示例代碼:
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
|
package linkedlist; public class DoubleLinkedListDemo { public static void main(String[] args) { // 測試 System.out.println( "雙向鏈表的測試" ); // 創(chuàng)建節(jié)點 Node node1 = new Node( 1 , "道明寺" ); Node node2 = new Node( 2 , "花澤類" ); Node node3 = new Node( 3 , "西門總二郎" ); Node node4 = new Node( 4 , "美作玲" ); // 創(chuàng)建一個雙向鏈表 DoubleLinkedList doubleLinkedList = new DoubleLinkedList(); // 添加節(jié)點 doubleLinkedList.addByOrder(node1); doubleLinkedList.addByOrder(node4); doubleLinkedList.addByOrder(node3); doubleLinkedList.addByOrder(node2); // 顯示排序后的雙向鏈表 doubleLinkedList.list(); } } // 創(chuàng)建一個雙向鏈表的類 class DoubleLinkedList { // 先初始化頭節(jié)點,頭節(jié)點不動 private Node head = new Node( 0 , "" ); // 返回頭節(jié)點 public Node getHead() { return head; } // 添加節(jié)點時,根據(jù)編號將節(jié)點插入到指定位置 // 如果有這個編號,則添加失敗,并給出提示 public void addByOrder(Node node) { // 頭節(jié)點不能動,通過一個輔助指針(變量)幫助找到需要添加的位置 Node temp = head; boolean flag = false ; // flag標(biāo)志添加的編號是否存在,默認(rèn)為false while ( true ) { if (temp.next == null ) { break ; } if (temp.next.no > node.no) { break ; } if (temp.next.no == node.no) { flag = true ; break ; } temp = temp.next; // 遍歷鏈表 } if (flag) { System.out.printf( "輸入的編號%d已經(jīng)存在,不能加入\n" , node.no); } else { // 為防止出現(xiàn)空指針的情況,需要對temp節(jié)點位置進(jìn)行判斷 // 若雙向鏈表尚未到達(dá)尾端,則需要將node節(jié)點與其相鄰的后面的節(jié)點進(jìn)行連接 if (temp.next != null ) { node.next = temp.next; temp.next.pre = node; } // 無論雙向鏈表是否到達(dá)尾端,都需要將node節(jié)點與其相鄰的前面的節(jié)點進(jìn)行連接 temp.next = node; node.pre = temp; } } // 遍歷雙向鏈表的方法 // 顯示鏈表【遍歷】 public void list() { // 判斷鏈表是否為空 if (head.next == null ) { System.out.println( "鏈表為空" ); return ; } // 因為頭節(jié)點不能動,需要一個輔助變量來遍歷 Node temp = head.next; while ( true ) { // 判斷是否到鏈表最后 if (temp == null ) break ; // 輸出節(jié)點的信息 System.out.println(temp); // 將temp后移 temp = temp.next; } } } // 創(chuàng)建一個雙向鏈表的類 // 定義Node,每個Node對象就是一個節(jié)點 class Node { public int no; public String name; public Node next; // 指向下一個節(jié)點,默認(rèn)為null public Node pre; // 指向前一個節(jié)點,默認(rèn)為null // 構(gòu)造器 public Node( int no, String name) { this .no = no; this .name = name; } // 為了顯示方便,重新toString @Override public String toString() { return "Node [no=" + no + ", name=" + name + "]" ; } } |
運行結(jié)果運行結(jié)果
總結(jié)
到此這篇關(guān)于Java雙向鏈表按照順序添加節(jié)點的文章就介紹到這了,更多相關(guān)Java雙向鏈表按照順序添加節(jié)點內(nèi)容請搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!
原文鏈接:https://blog.csdn.net/Peppaaa/article/details/113546576