Java如何實(shí)現(xiàn)單鏈表的增刪改查
一、新建學(xué)生節(jié)點(diǎn)類(lèi)
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)容需要重寫(xiě)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;
}
}
二、新建一個(gè)操作鏈表的類(lèi),實(shí)現(xiàn)增刪改查方法
1>創(chuàng)建鏈表的實(shí)現(xiàn)類(lèi)對(duì)象
class SingleLinkedList{
}
2>在類(lèi)里實(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)存在,輸出插入失?。蝗绻鹒lag為假,令插入節(jié)點(diǎn)的下一節(jié)點(diǎn)指向temp的下一節(jié)點(diǎn),temp節(jié)點(diǎn)的下一節(jié)點(diǎn)指向帶插入節(jié)點(diǎn)。(畫(huà)圖方便理解,圖自行腦補(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)不存在,無(wú)法修改!");
}
}
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除的鏈表");
}
}
}
三、新建操作鏈表類(lèi)的實(shí)現(xiàn)類(lèi)實(shí)現(xiàn)其增刪改查功能
1、新建操作鏈表類(lèi)的實(shí)現(xiàn)類(lèi)對(duì)象
2、新建多個(gè)待操作的節(jié)點(diǎn)
3、使用新建的鏈表操作類(lèi)對(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
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)不存在,無(wú)法修改!");
}
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除的鏈表");
}
}
}
總結(jié)
到此這篇關(guān)于Java如何實(shí)現(xiàn)單鏈表增刪改查的文章就介紹到這了,更多相關(guān)Java單鏈增刪改查內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用SpringBoot 工廠模式自動(dòng)注入到Map
這篇文章主要介紹了使用SpringBoot 工廠模式自動(dòng)注入到Map,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
MyBatis測(cè)試報(bào)錯(cuò):Cannot?determine?value?type?from?string?&a
這篇文章主要給大家介紹了關(guān)于MyBatis測(cè)試報(bào)錯(cuò):Cannot?determine?value?type?from?string?'xxx'的解決辦法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02
SpringMVC深入講解文件的上傳下載實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了springMVC實(shí)現(xiàn)文件上傳和下載的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06
Spring Boot+Mybatis+Pagehelper分頁(yè)實(shí)現(xiàn)
本篇文章主要講述的是Spring Boot+Mybatis+Pagehelper分頁(yè)實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
Java使用Validation自定義Double類(lèi)型屬性校驗(yàn)
這篇文章主要為大家詳細(xì)介紹了Java如何使用Validation自定義Double類(lèi)型屬性校驗(yàn),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下2024-11-11
JAVA NIO實(shí)現(xiàn)簡(jiǎn)單聊天室功能
這篇文章主要為大家詳細(xì)介紹了JAVA NIO實(shí)現(xiàn)簡(jiǎn)單聊天室功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11
Java實(shí)現(xiàn)簡(jiǎn)單的飛機(jī)大戰(zhàn)游戲(控制主飛機(jī)篇)
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡(jiǎn)單的飛機(jī)大戰(zhàn)游戲,控制主飛機(jī),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05
java客戶端Jedis操作Redis Sentinel 連接池的實(shí)現(xiàn)方法
下面小編就為大家?guī)?lái)一篇java客戶端Jedis操作Redis Sentinel 連接池的實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-03-03
詳解Java如何實(shí)現(xiàn)有效的并發(fā)處理
隨著互聯(lián)網(wǎng)的蓬勃發(fā)展,現(xiàn)代軟件系統(tǒng)對(duì)于并發(fā)性能的要求越來(lái)越高,如何學(xué)習(xí)和掌握并發(fā)編程技術(shù)成為了Java開(kāi)發(fā)人員必備的技能之一,本文主要介紹了Java并發(fā)編程的相關(guān)概念、原理和實(shí)踐技巧,感興趣的可以了解下2023-11-11

