您好,登錄后才能下訂單哦!
Java中怎么對(duì)單鏈表進(jìn)行增刪改查操作,針對(duì)這個(gè)問題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡(jiǎn)單易行的方法。
一、新建學(xué)生節(jié)點(diǎn)類 Stu_Node節(jié)點(diǎn)包含:
學(xué)號(hào):int num;
姓名:String name;
性別:String gender;
下一個(gè)節(jié)點(diǎn):Stu_Node next;
為了便于打印節(jié)點(diǎn)內(nèi)容需要重寫toString方法
class Stu_Node{ int num; String name; String gender; Stu_Node next;
[@Override](https://my.oschina.net/u/1162528) 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; }
} 二、新建一個(gè)操作鏈表的類,實(shí)現(xiàn)增刪改查方法 1>創(chuàng)建鏈表的實(shí)現(xiàn)類對(duì)象 class SingleLinkedList{
} 2>在類里實(shí)現(xiàn)尾結(jié)點(diǎn)添加鏈表節(jié)點(diǎn)方法 1、定義一個(gè)頭結(jié)點(diǎn)head為空。
2、定義一個(gè)節(jié)點(diǎn)變量temp等于頭結(jié)點(diǎn)head。
3、遍歷鏈表找到尾結(jié)點(diǎn)。
while循環(huán),結(jié)束的標(biāo)志是temp的下一個(gè)節(jié)點(diǎn)為空,此時(shí)終止while(否則程序會(huì)陷入死循環(huán)),循環(huán)每進(jìn)行一次要把temp節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)賦值給temp變量(否則程序會(huì)陷入死循環(huán))。
4、使temp節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)指向新增的節(jié)點(diǎn)。
class SingleLinkedList{ Stu_Node head = new Stu_Node(0,"null","null"); //鏈表的尾節(jié)點(diǎn)添加方法 public void add(Stu_Node node){ Stu_Node temp = head; while(true){ if (temp.next==null){ break; } temp = temp.next; } temp.next=node; }
} 按學(xué)號(hào)順序插入節(jié)點(diǎn)
1、新建臨時(shí)節(jié)點(diǎn)temp
2、新建boolean變量flag用于找到當(dāng)前帶插入節(jié)點(diǎn)的位置
3、while循環(huán)遍歷鏈表找到插入節(jié)點(diǎn)位置,如果temp的下一節(jié)點(diǎn)為空表示鏈表已經(jīng)遍歷完畢此時(shí)終止循環(huán);如果temp的下一節(jié)點(diǎn)的學(xué)號(hào)等于要插入的節(jié)點(diǎn)學(xué)號(hào),此時(shí)將flag變量賦值為true結(jié)束循環(huán)(帶插入的節(jié)點(diǎn)已經(jīng)存在插入失?。?;如果temp節(jié)點(diǎn)的下一節(jié)點(diǎn)的學(xué)號(hào)大于帶插入節(jié)點(diǎn)的學(xué)號(hào),此時(shí)temp下一節(jié)點(diǎn)指向的位置就是要插入的位置。每次鏈表遍歷一次節(jié)點(diǎn)要將temp的下一節(jié)點(diǎn)賦值給temp節(jié)點(diǎn)避免死循環(huán)。
4、如果flag為真表示,要插入的節(jié)點(diǎn)已經(jīng)存在,輸出插入失??;如果flag為假,令插入節(jié)點(diǎn)的下一節(jié)點(diǎn)指向temp的下一節(jié)點(diǎn),temp節(jié)點(diǎn)的下一節(jié)點(diǎn)指向帶插入節(jié)點(diǎn)。(畫圖方便理解,圖自行腦補(bǔ))
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、判斷頭結(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)是否為空,如果為空輸出鏈表為空。
2、定義一個(gè)temp節(jié)點(diǎn)變量,將頭結(jié)點(diǎn)的指向的節(jié)點(diǎn)賦值給temp。
3、遍歷鏈表打印節(jié)點(diǎn)數(shù)據(jù)。 while循環(huán),打印鏈表節(jié)點(diǎn),每打印一次temp節(jié)點(diǎn),使temp節(jié)點(diǎn)的下一節(jié)點(diǎn)賦值給temp避免程序陷入死循環(huán),循環(huán)結(jié)束標(biāo)志是temp的節(jié)點(diǎn)為空(因?yàn)閠emp節(jié)點(diǎn)是頭結(jié)點(diǎn)head的下一節(jié)點(diǎn))。
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>修改鏈表中的數(shù)據(jù)(假設(shè)學(xué)號(hào)為維一值) 1、首先判斷鏈表是否為空
2、定義一個(gè)臨時(shí)變量temp將頭結(jié)點(diǎn)賦值給temp
3、定義一個(gè)Boolean變量flag用于判斷鏈表中是否存在要修改的節(jié)點(diǎn)。
4、遍歷鏈表,while循環(huán)查詢要修改的節(jié)點(diǎn),每查詢一次就將temp變量賦值為temp的next節(jié)點(diǎn),如果查詢到要修改的節(jié)點(diǎn)將flag變量賦值為真、終止while循環(huán),如果temp的下一節(jié)點(diǎn)為空表示未找到要修改的節(jié)點(diǎn)變量,此時(shí)也終止循環(huán)。
5、判斷flag值為真代表找到當(dāng)前要修改的節(jié)點(diǎn),將要新的節(jié)點(diǎn)的值賦值給要修改節(jié)點(diǎn)的值;如果flag為假表示未找到當(dāng)前節(jié)點(diǎn)。
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("當(dāng)前節(jié)點(diǎn)不存在,無法修改!"); } } 5>依據(jù)學(xué)號(hào)刪除節(jié)點(diǎn) 1、定義一個(gè)臨時(shí)節(jié)點(diǎn)temp,將頭結(jié)點(diǎn)賦值給temp
2、定義一個(gè)boolean型變量flag用于判斷是否找到當(dāng)前鏈表中待刪除的節(jié)點(diǎn)
3、while循環(huán)遍歷當(dāng)前鏈表,每遍歷一次節(jié)點(diǎn),將temp節(jié)點(diǎn)的下一節(jié)點(diǎn)賦值給temp避免循環(huán),如果待刪除節(jié)點(diǎn)的學(xué)號(hào)跟要?jiǎng)h除的節(jié)點(diǎn)的學(xué)號(hào)一至,將flag賦值為true終止while循環(huán),否則持續(xù)遍歷鏈表直到temp節(jié)點(diǎn)的下一節(jié)點(diǎn)為空終止循環(huán)。
4、如果flag為真,代表找到當(dāng)前要?jiǎng)h除的節(jié)點(diǎn),將temp的下一節(jié)點(diǎn)指向temp下一節(jié)點(diǎn)的下一節(jié)點(diǎn)。,如果flag為假代表找不到待刪除的節(jié)點(diǎn)。
class SingleLinkedList{ Stu_Node head = new Stu_Node(0,"null","null"); //刪除鏈表的節(jié)點(diǎn) 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("未找到要?jiǎng)h除的鏈表"); }
}
} 三、新建操作鏈表類的實(shí)現(xiàn)類實(shí)現(xiàn)其增刪改查功能 1、新建操作鏈表類的實(shí)現(xiàn)類對(duì)象
2、新建多個(gè)待操作的節(jié)點(diǎn)
3、使用新建的鏈表操作類對(duì)象進(jìn)行增刪改查功能
完整代碼如下:
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("按學(xué)號(hào)順序插入節(jié)點(diǎn)"); 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](https://my.oschina.net/u/1162528) 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"); //鏈表的尾節(jié)點(diǎn)添加方法 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("當(dāng)前節(jié)點(diǎn)不存在,無法修改!"); } 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("未找到要?jiǎng)h除的鏈表"); } }
關(guān)于Java中怎么對(duì)單鏈表進(jìn)行增刪改查操作問題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。