單鏈表的插入
尾插法:使用一個臨時結點直接找到最后一個結點 \(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 +
'}';
}
}