Linked List
鏈表的理解
小結
- 鏈表是以節點的方式來儲存的
- 每個節點包括 data域:存放數據,next域:指向下一個節點
- 如圖:發現鏈表的各個節點不一定是連續儲存的
- 鏈表分爲帶頭節點的鏈表和沒有頭結點的鏈表,這樣根據實際需求而定。
單向鏈表
添加
添加到最後
- 找到鏈表的最後一個節點[通過節點的
next == null]
- 將最後這個節點的
next
指向新的節點
//初始化一個頭結點,裏面什麼都不放
HeroNode head = new HeroNode(0, "", "");
/**
* 向鏈表中添加一個節點
* 不考慮編號順序
*/
public void add(HeroNode heroNode) {
//因爲頭節點是不能動的,使用中間變量temp來保存頭節點
HeroNode temp = head;
//遍歷節點,找到最後一個節點【通過最後一個節點next指向爲 null】
while (true) {
if (temp.next == null) {
//找到最後一個節點
break;
}
//沒有找到就將temp後移一個
temp = temp.next;
}
// 當循環退出的時候temp就指向節點的最後一個
temp.next = heroNode;
}
考慮編號順序添加
-
找到新添加節點的位置,通過輔助變量(
temp
)[遍歷找到新節點的位置] -
新的節點.next = temp.next
-
temp.next = 新的節點
/**
* 考慮排序編號添加
*
* @param heroNode
*/
public void addByOrder(HeroNode heroNode) {
//因爲頭節點是不能動的,使用輔助變量temp尋找位置
HeroNode temp = head;
//用來代表當前添加的節點的編號是否存在,默認false不存在
boolean flag = false;
while (true) {
if (temp.next == null) {
//當前temp爲鏈表最後一個
break;
}
if (temp.next.no > heroNode.no) {
//找到需要添加的位置,就在temp後面添加
break;
} else if (temp.next.no == heroNode.no) {
//需要添加的節點已經存在
flag = true;
break;
}
//三個條件不成立 temp後移
temp = temp.next;
}
if (flag) {
//不能添加,編號存在
System.out.printf("當前添加的英雄編號 %d 已經存在, 不能添加\n", heroNode.no);
} else {
//在temp後面進行添加
heroNode.next = temp.next;
temp.next = heroNode;
}
}
修改
- 使用
temp.no == newHeroNode.no
判斷是否爲需要修改的節點
/**
* 更新節點
*
* @param newHeroNode
*/
public void update(HeroNode newHeroNode) {
if (head.next == null) {
System.out.println("當前鏈表爲空");
return;
}
//因爲頭節點是不能動的,使用中間變量temp來保存頭節點
HeroNode temp = head;
boolean flag = false; //用來表示鏈表中是否存在需要修改的節點
while (true) {
if (temp.next == null) {
break;
}
if (temp.no == newHeroNode.no) {
flag = true;
break;
}
temp = temp.next; //temp後移
}
if (flag) {
temp.name = newHeroNode.name;
temp.nickName = newHeroNode.nickName;
} else {
System.out.printf("沒有找到編號爲:%d 節點", newHeroNode.no);
}
}
刪除
- 找到需要刪除的節點的前一個節點
temp
temp.next = temp.next.next
- 被刪除的節點 將不會有其他引用指向,會被垃圾回收機制回收
/**
* 刪除節點
*
* @param no
*/
public void del(int no) {
if (head.next == null) {
System.out.println("當前鏈表爲空");
return;
}
//因爲頭節點是不能動的,使用中間變量temp來保存頭節點
HeroNode temp = head;
boolean flag = false; //表示是否找到需要刪除的節點
while (true) {
if (temp.next == null) {
break;
}
if (temp.next.no == no) {
flag = true;
break;
}
temp = temp.next;
}
//刪除需要刪除的節點
if (flag) {
temp.next = temp.next.next;
} else {
System.out.printf("不存在編號爲 %d 的節點 刪除失敗\n", no);
}
}
dataStructures: gitee
dataStructures: github