資料結構 - 單鏈表的建立、插入、修改、刪除和遍歷(Java實現)
阿新 • • 發佈:2020-08-27
單鏈表的插入
尾插法:使用一個臨時結點直接找到最後一個結點 \(temp\),然後 \(temp.next = newNode, newNode.next = null\)
在中間結點插入一個結點:找到要插入結點的位置的前一個位置的結點 \(temp\),讓待插入結點的 \(next\) 域指向 \(temp\) 的後面的結點,最後讓 \(temp\) 的 \(next\) 域指向待插入結點即可。即 \(newNode.next = temp.next,temp.next = newNode.next\)
//在連結串列的最後插入一個元素,尾插法 public void insertList(PersonNode personNode) { PersonNode temp = head; while(temp.next != null) {//找到最後一個結點 temp = temp.next; } temp.next = personNode; }
//按照結點順序插入 public void insertListByOrder(PersonNode personNode) { PersonNode temp = head; while(temp.next != null && temp.next.STNumber != personNode.STNumber && temp.next.STNumber < personNode.STNumber) { temp = temp.next; } if(temp.next == null) { temp.next = personNode; } else if(temp.next.STNumber == personNode.STNumber) { System.out.printf("學號 %d 已經存在無法插入\n", personNode.STNumber); } else { personNode.next = temp.next; temp.next = personNode; } }
單鏈表的修改
直接找到對應位置的結點,然後修改結點資訊為新的值。
//根據學號修改結點資訊 public void updateList(int STNumber, String name) { if(head.next == null) { System.out.println("連結串列為空,無法進行修改!"); return ; } PersonNode temp = head.next; while(temp != null && temp.STNumber != STNumber) { temp = temp.next; } if(temp == null) { System.out.printf("學號 %d 不存在,無法修改!\n", STNumber); return ; } temp.name = name; }
單鏈表的刪除
找到要刪除的結點的前面一個位置的結點 \(temp\),直接讓 \(temp.next = temp.next.next\)
//刪除結點資訊
public void deleteList(int STNumber) {
if(head.next == null) {
System.out.println("連結串列為空,無法進行刪除");
return ;
}
PersonNode temp = head;
while(temp.next != null && temp.next.STNumber != STNumber) {
temp = temp.next;
}
if(temp.next == null) {
System.out.printf("學號%d不存在,無法刪除該學生\n", STNumber);
return ;
}
temp.next = temp.next.next;
}
單鏈表的遍歷
直接一邊檢視 \(temp\) 是否為 \(null\),一邊輸出結點資訊
//遍歷連結串列
public void outputList() {
if(head.next == null) {
System.out.println("連結串列為空,請新增結點後進行遍歷!");
return ;
}
PersonNode temp = head.next;
while(temp != null) {
System.out.println(temp);
temp = temp.next;
}
}
整體測試程式碼
import org.w3c.dom.ls.LSOutput;
public class SingleLinkedListTest1 {
public static void main(String[] args) {
PersonNode person1 = new PersonNode(1, "111", "1", 1);
PersonNode person2 = new PersonNode(2, "222", "2", 2);
PersonNode person3 = new PersonNode(3, "333", "3", 3);
SingleLinkedList1 singleLinkedList = new SingleLinkedList1();
singleLinkedList.outputList();
singleLinkedList.insertListByOrder(person1);
singleLinkedList.insertListByOrder(person3);
singleLinkedList.insertListByOrder(person2);
singleLinkedList.outputList();
singleLinkedList.updateList(1, "update1");
singleLinkedList.updateList(4, "update4");
singleLinkedList.outputList();
singleLinkedList.deleteList(1);
singleLinkedList.deleteList(4);
singleLinkedList.deleteList(2);
singleLinkedList.deleteList(3);
singleLinkedList.deleteList(1);
singleLinkedList.outputList();
}
}
class SingleLinkedList1 {
//初始化頭結點
private PersonNode head = new PersonNode(0, "", "", 0);
//在連結串列的最後插入一個元素,尾插法
public void insertList(PersonNode personNode) {
PersonNode temp = head;
while(temp.next != null) {//找到最後一個結點
temp = temp.next;
}
temp.next = personNode;
}
//遍歷連結串列
public void outputList() {
if(head.next == null) {
System.out.println("連結串列為空,請新增結點後進行遍歷!");
return ;
}
PersonNode temp = head.next;
while(temp != null) {
System.out.println(temp);
temp = temp.next;
}
}
//根據學號修改結點資訊
public void updateList(int STNumber, String name) {
if(head.next == null) {
System.out.println("連結串列為空,無法進行修改!");
return ;
}
PersonNode temp = head.next;
while(temp != null && temp.STNumber != STNumber) {
temp = temp.next;
}
if(temp == null) {
System.out.printf("學號 %d 不存在,無法修改!\n", STNumber);
return ;
}
temp.name = name;
}
//刪除結點資訊
public void deleteList(int STNumber) {
if(head.next == null) {
System.out.println("連結串列為空,無法進行刪除");
return ;
}
PersonNode temp = head;
while(temp.next != null && temp.next.STNumber != STNumber) {
temp = temp.next;
}
if(temp.next == null) {
System.out.printf("學號%d不存在,無法刪除該學生\n", STNumber);
return ;
}
temp.next = temp.next.next;
}
//按照結點順序插入
public void insertListByOrder(PersonNode personNode) {
PersonNode temp = head;
while(temp.next != null && temp.next.STNumber != personNode.STNumber && temp.next.STNumber < personNode.STNumber) {
temp = temp.next;
}
if(temp.next == null) {
temp.next = personNode;
} else if(temp.next.STNumber == personNode.STNumber) {
System.out.printf("學號 %d 已經存在無法插入\n", personNode.STNumber);
} else {
personNode.next = temp.next;
temp.next = personNode;
}
}
}
//連結串列中儲存的結點資訊
class PersonNode{
int STNumber;
String name;
String gender;
int age;
PersonNode next;
public PersonNode(int STNumber, String name, String gender, int age) {
this.STNumber = STNumber;
this.name = name;
this.gender = gender;
this.age = age;
}
@Override
public String toString() {
return "PersonNode{" +
"STNumber='" + STNumber + '\'' +
", name='" + name + '\'' +
", gender='" + gender + '\'' +
", age=" + age +
'}';
}
}