1.雙向鏈表增刪改 直接找到該節點即可,因爲有pre可以找到上一個
2.設置 新插入節點時, Next: 先設置 newHead的 next Pre : 先設置 原來節點的前一個 指向新節點
static class HeroNodeD {
private int number;
private String name;
private String nickName;
private HeroNodeD next; 指向下一個
private HeroNodeD pre; 指向上一個
public HeroNodeD(int number, String name, String nickName) {
this.number = number;
this.name = name;
this.nickName = nickName;
}}
一.直接向最後添加
* 向 雙向鏈表最後添加
public void add(HeroNodeD headNode) {
HeroNodeD tmp = HeadNode; //定一個臨時變量指向頭結點
while (true) {
if (tmp.next == null) { //如果頭結點的下一位爲空,那麼將傳入的節點設置爲它的下一位
tmp.next = headNode;
headNode.pre=tmp; 設置插入的head的前一位
break;
}
tmp = tmp.next; //如果不爲空,指向下一位 }}
二.順序插入
1.與單鏈表類似,只是在需要 加入pre 2.判斷當第一個插入時,判斷 tmp.next!=null 不是最後一個 再設置它的 pre
順序插入,並且不能重複插入已經存在的編號
public void addByOder(HeroNodeD headNode) {
HeroNodeD tmp = HeadNode; //將頭結點,賦值給臨時變量,以便操作
Boolean flag = false; //表示要插入的節點是否存在
while (true) {
if (tmp.next == null) { //已經最後一個了,直接插入
break;
}
if (tmp.next.number > headNode.number) {
//表示tmp的下一個大於headNode那麼headNode就插入到tmp之後就行了
break;
} else if (tmp.next.number == headNode.number) {
flag = true;
break;
}
tmp = tmp.next;
}
if (flag == true) {
System.out.printf("已經存在%d號節點,不能插入~~\n", headNode.number);
} else { //可以插入
// 將headNode的下一位指向tmp的下一位
headNode.next = tmp.next;
if (tmp.next!=null){ //如果 tmp不是最後一個
tmp.next.pre = headNode; //就將tmp.下一個的前指向 新添的這個
}
//將tmp的下一位指向 headNode,
tmp.next = headNode;
headNode.pre=tmp; }}
三.修改節點與單鏈表一樣
四.刪除節點
1.判斷最後一個刪除時,判斷 tmp.next!=null 不是最後一個 再設置它的 pre
2.直接找到刪除節點 tmp.pre.next = tmp.next; tmp.next.pre=tmp.pre;
public void delete(int number) {
Boolean flag = false; //表示是否找到該節點
HeroNodeD tmp = HeadNode.next;
while (true) {
if (tmp == null) {
break;
}
if (tmp.number == number) { //找到該編號的上一個節點
flag = true;
break;
}
tmp = tmp.next;
}
if (flag) {
tmp.pre.next = tmp.next;
if (tmp.next!=null){
tmp.next.pre=tmp.pre;
}
} else {
System.out.printf("不存在該%d號節點\n", number); }}