您好,登錄后才能下訂單哦!
這篇“如何使用Java實現單鏈表的增刪改查”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“如何使用Java實現單鏈表的增刪改查”文章吧。
Stu_Node節點包含:
學號:int num;
姓名:String name;
性別:String gender;
下一個節點:Stu_Node next;
為了便于打印節點內容需要重寫toString方法
class Stu_Node{
int num;
String name;
String gender;
Stu_Node next;
@Override
public String toString() {
return "Stu_Node{" +
"num=" + num +
", name='" + name + ''' +
", gender='" + gender + ''' +
'}';
}
public Stu_Node(int num, String name, String gender){
this.num=num;
this.name=name;
this.gender=gender;
}
}
1>創建鏈表的實現類對象
class SingleLinkedList{
}
2>在類里實現尾結點添加鏈表節點方法
1、定義一個頭結點head為空。
2、定義一個節點變量temp等于頭結點head。
3、遍歷鏈表找到尾結點。
while循環,結束的標志是temp的下一個節點為空,此時終止while(否則程序會陷入死循環),循環每進行一次要把temp節點的下一個節點賦值給temp變量(否則程序會陷入死循環)。
4、使temp節點的下一個節點指向新增的節點。
class SingleLinkedList{
Stu_Node head = new Stu_Node(0,"null","null");
//鏈表的尾節點添加方法
public void add(Stu_Node node){
Stu_Node temp = head;
while(true){
if (temp.next==null){
break;
}
temp = temp.next;
}
temp.next=node;
}
}
按學號順序插入節點
1、新建臨時節點temp
2、新建boolean變量flag用于找到當前帶插入節點的位置
3、while循環遍歷鏈表找到插入節點位置,如果temp的下一節點為空表示鏈表已經遍歷完畢此時終止循環;如果temp的下一節點的學號等于要插入的節點學號,此時將flag變量賦值為true結束循環(帶插入的節點已經存在插入失敗);如果temp節點的下一節點的學號大于帶插入節點的學號,此時temp下一節點指向的位置就是要插入的位置。每次鏈表遍歷一次節點要將temp的下一節點賦值給temp節點避免死循環。
4、如果flag為真表示,要插入的節點已經存在,輸出插入失敗;如果flag為假,令插入節點的下一節點指向temp的下一節點,temp節點的下一節點指向帶插入節點。(畫圖方便理解,圖自行腦補)
public void addOrder(Stu_Node node){
Stu_Node temp = head;
boolean flag = false;
while(true){
if (temp.next==null)
break;
if (temp.next.num >node.num){
break;
}
else if (temp.next.num==node.num){
flag = true;
break;
}
temp=temp.next;
}
if (flag){
System.out.println("插入失敗");
}
else{
node.next=temp.next;
temp.next=node;
}
}
3>打印鏈表
1、判斷頭結點的下一個節點是否為空,如果為空輸出鏈表為空。
2、定義一個temp節點變量,將頭結點的指向的節點賦值給temp。
3、遍歷鏈表打印節點數據。
while循環,打印鏈表節點,每打印一次temp節點,使temp節點的下一節點賦值給temp避免程序陷入死循環,循環結束標志是temp的節點為空(因為temp節點是頭結點head的下一節點)。
class SingleLinkedList{
Stu_Node head = new Stu_Node(0,"null","null");
//打印單鏈表
public void print(){
if (head.next==null){
System.out.println("鏈表為空");
}
Stu_Node temp = head.next;
while(true){
if (temp==null){
break;
}
System.out.println(temp);
temp=temp.next;
}
}
}
4>修改鏈表中的數據(假設學號為維一值)
1、首先判斷鏈表是否為空
2、定義一個臨時變量temp將頭結點賦值給temp
3、定義一個Boolean變量flag用于判斷鏈表中是否存在要修改的節點。
4、遍歷鏈表,while循環查詢要修改的節點,每查詢一次就將temp變量賦值為temp的next節點,如果查詢到要修改的節點將flag變量賦值為真、終止while循環,如果temp的下一節點為空表示未找到要修改的節點變量,此時也終止循環。
5、判斷flag值為真代表找到當前要修改的節點,將要新的節點的值賦值給要修改節點的值;如果flag為假表示未找到當前節點。
class SingleLinkedList{
Stu_Node head = new Stu_Node(0,"null","null");
//鏈表的修改方法
public void update(Stu_Node newnode){
if (head.next==null){
System.out.println("鏈表為空");
}
Stu_Node temp = head;
boolean flag = false;
while (true){
if (temp.next==null){
break;
}
if (temp.num== newnode.num){
flag = true;
break;
}
temp=temp.next;
}
if (flag){
temp.name=newnode.name;
temp.gender= newnode.gender;
}
else
System.out.println("當前節點不存在,無法修改!");
}
}
5>依據學號刪除節點
1、定義一個臨時節點temp,將頭結點賦值給temp
2、定義一個boolean型變量flag用于判斷是否找到當前鏈表中待刪除的節點
3、while循環遍歷當前鏈表,每遍歷一次節點,將temp節點的下一節點賦值給temp避免循環,如果待刪除節點的學號跟要刪除的節點的學號一至,將flag賦值為true終止while循環,否則持續遍歷鏈表直到temp節點的下一節點為空終止循環。
4、如果flag為真,代表找到當前要刪除的節點,將temp的下一節點指向temp下一節點的下一節點。,如果flag為假代表找不到待刪除的節點。
class SingleLinkedList{
Stu_Node head = new Stu_Node(0,"null","null");
//刪除鏈表的節點
public void delete(int no){
Stu_Node temp = head;
boolean flag = false;
while(true){
if (temp.next==null)
break;
if (temp.next.num==no){
flag=true;
break;
}
temp = temp.next;
}
if (flag){
temp.next=temp.next.next;
}
else{
System.out.println("未找到要刪除的鏈表");
}
}
}
1、新建操作鏈表類的實現類對象
2、新建多個待操作的節點
3、使用新建的鏈表操作類對象進行增刪改查功能
完整代碼如下:
public class linkedlist {
public static void main(String[] args) {
SingleLinkedList list = new SingleLinkedList();
Stu_Node node1 = new Stu_Node(1903210086,"小明","男");
Stu_Node node2 = new Stu_Node(1903210087,"小花","女");
Stu_Node node3 = new Stu_Node(1903210088,"小黃","男");
Stu_Node node4 = new Stu_Node(1903210089,"小翠","女");
list.add(node1);
list.add(node4);
list.add(node3);
list.add(node2);
list.print();
System.out.println("----------------------");
System.out.println("按學號順序插入節點");
SingleLinkedList list_1= new SingleLinkedList();
list_1.addOrder(node1);
list_1.addOrder(node4);
list_1.addOrder(node3);
list_1.addOrder(node2);
list_1.print();
System.out.println("-----------------------");
Stu_Node node5 = new Stu_Node(1903210089,"賈明","男");
list.update(node5);
list.print();
System.out.println("#######################");
System.out.println("刪除之后的鏈表");
list.delete(1903210088);
list.print();
}
}
class Stu_Node{
int num;
String name;
String gender;
Stu_Node next;
@Override
public String toString() {
return "Stu_Node{" +
"num=" + num +
", name='" + name + ''' +
", gender='" + gender + ''' +
'}';
}
public Stu_Node(int num, String name, String gender){
this.num=num;
this.name=name;
this.gender=gender;
}
}
class SingleLinkedList{
Stu_Node head = new Stu_Node(0,"null","null");
//鏈表的尾節點添加方法
public void add(Stu_Node node){
Stu_Node temp = head;
while(true){
if (temp.next==null){
break;
}
temp = temp.next;
}
temp.next=node;
}
public void addOrder(Stu_Node node){
Stu_Node temp = head;
boolean flag = false;
while(true){
if (temp.next==null)
break;
if (temp.next.num >node.num){
break;
}
else if (temp.next.num==node.num){
flag = true;
break;
}
temp=temp.next;
}
if (flag){
System.out.println("插入失敗");
}
else{
node.next=temp.next;
temp.next=node;
}
}
public void print(){
if (head.next==null){
System.out.println("鏈表為空");
}
Stu_Node temp = head.next;
while(true){
if (temp==null){
break;
}
System.out.println(temp);
temp=temp.next;
}
}
public void update(Stu_Node newnode){
if (head.next==null){
System.out.println("鏈表為空");
}
Stu_Node temp = head;
boolean flag = false;
while (true){
if (temp.next==null){
break;
}
if (temp.num== newnode.num){
flag = true;
break;
}
temp=temp.next;
}
if (flag){
temp.name=newnode.name;
temp.gender= newnode.gender;
}
else
System.out.println("當前節點不存在,無法修改!");
}
public void delete(int no){
Stu_Node temp = head;
boolean flag = false;
while(true){
if (temp.next==null)
break;
if (temp.next.num==no){
flag=true;
break;
}
temp = temp.next;
}
if (flag){
temp.next=temp.next.next;
}
else{
System.out.println("未找到要刪除的鏈表");
}
}
}
以上就是關于“如何使用Java實現單鏈表的增刪改查”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。