日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据结构 - 单链表(Linked List)实现在内存中实现数据以链表形式生成并根据序号排序

發布時間:2023/12/10 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构 - 单链表(Linked List)实现在内存中实现数据以链表形式生成并根据序号排序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

下面實現一個例子來進行學習

1)介紹

單鏈表的邏輯結構

在內存中的實際結構

具體創建示意圖:

2)代碼實現

例子

1。第一個程序在添加的時候并沒有按照序號排序,如果在添加的時候把位置改變輸出的時候序號會改變

package DataStructures.LinkedList;public class SingleLinedListDemo {public static void main(String[] args) {//進行測試//先創建節點HeroNode hero1 = new HeroNode(1, "宋江", "及時雨");HeroNode hero2 = new HeroNode(2, "盧俊義", "玉麒麟");HeroNode hero3 = new HeroNode(3, "吳用", "智多星");HeroNode hero4 = new HeroNode(4, "林沖", "豹子頭");//創建要給的鏈表SingleLinkedList linkedList = new SingleLinkedList();//加入linkedList.add(hero1);linkedList.add(hero2);linkedList.add(hero3);linkedList.add(hero4);//顯示linkedList.list();} }//定義一個SingleLinkedList 管理人物 class SingleLinkedList{//初始化一個頭結點,頭結點不要動,不存放具體數據private HeroNode head = new HeroNode(0,"","");//添加節點到單鏈表//思路:當不考慮編號的順序時//1.找到當前鏈表的最后節點//2.將最后這個節點的next 指向 新的節點public void add(HeroNode heroNode){//因為head節點不能動,因此我們需要一個輔助變量 tempHeroNode temp = head;//遍歷鏈表,找到最后while(true){//找到鏈表的最后if(temp.next == null){break;}//如果沒找到,temp后移temp = temp.next;}//當退出while循環時temp指向了鏈表的最后//將最后這個節點的next 指向 新的節點temp.next = heroNode;}public void list(){//先判斷鏈表是否為空if (head.next == null){return;}//因為頭結點不能動,因此我們需要一個輔助變量來遍歷HeroNode temp = head.next;while(true){//判斷鏈表是否為空if (temp == null){break;}//輸出節點信息System.out.println(temp);//將temp后移,一定要temp = temp.next;}}}//定義一個heroNode,每個heroNode就是一個節點 class HeroNode{public int no;public String name;public String nickName;public HeroNode next; //指向下一個節點//構造器public HeroNode(int no, String name, String nickname){this.no = no;this.name = name;this.nickName = nickname;}//為了顯示方便重寫toString@Overridepublic String toString() {return "HeroNode{" +"no=" + no +", name='" + name + '\'' +", nickName='" + nickName + '\'' +'}';} }

2。第二個程序下面的代碼會進行排序,這里排序我感覺和JAVA-API的實現ComparaTo類似

下面是思路分析

和上面程序比新添加了一個addByOrder()方法

這樣就可以在內存中實現數據以鏈表形式生成并根據序號排序,速度快效率高。

package DataStructures.LinkedList;public class SingleLinedListDemo {public static void main(String[] args) {//進行測試//先創建節點HeroNode hero1 = new HeroNode(1, "宋江", "及時雨");HeroNode hero2 = new HeroNode(2, "盧俊義", "玉麒麟");HeroNode hero3 = new HeroNode(3, "吳用", "智多星");HeroNode hero4 = new HeroNode(4, "林沖", "豹子頭");//創建要給的鏈表SingleLinkedList linkedList = new SingleLinkedList();//加入(按照加入的順序) // linkedList.add(hero1); // linkedList.add(hero2); // linkedList.add(hero3); // linkedList.add(hero4);//加入(按照no序號排序)linkedList.addByOrder(hero1);linkedList.addByOrder(hero4);linkedList.addByOrder(hero2);linkedList.addByOrder(hero3);linkedList.addByOrder(hero3);//顯示linkedList.list();} }//定義一個SingleLinkedList 管理人物 class SingleLinkedList{//初始化一個頭結點,頭結點不要動,不存放具體數據private HeroNode head = new HeroNode(0,"","");//添加節點到單鏈表//思路:當不考慮編號的順序時//1.找到當前鏈表的最后節點//2.將最后這個節點的next 指向 新的節點public void add(HeroNode heroNode){//因為head節點不能動,因此我們需要一個輔助變量 tempHeroNode temp = head;//遍歷鏈表,找到最后while(true){//找到鏈表的最后if(temp.next == null){break;}//如果沒找到,temp后移temp = temp.next;}//當退出while循環時temp指向了鏈表的最后//將最后這個節點的next 指向 新的節點temp.next = heroNode;}//第二種方式在添加人物的時候,根據排名將英雄插入到指定位置//(如果有這個排名,則添加失敗,并給出提示)public void addByOrder(HeroNode heroNode){//因為頭結點不能動,我們仍然需要通過一個輔助變量來幫助找到添加的位置//因為單鏈表,因此我們找的temp是位于添加位置的前一個節點,否則插入不了,因為前一個節點next才可以找到新插入的HeroNode temp = head;boolean flag = false;while (true) {if (temp.next == null) {//說明temp已經在鏈表最后break;}if (temp.next.no > heroNode.no) { //位置找到,就在temp后面插入break;}else if (temp.next.no == heroNode.no){//說明新添加的編號存在flag = true;//說明編號存在break;}temp = temp.next; //后移}//判斷flag 的值if(flag){//不能添加,已經存在System.out.printf("人物編號%d 已經存在,不能添加\n",heroNode.no);} else {//插入到鏈表中,temp后heroNode.next = temp.next; //連接新的節點的next和下一個的datatemp.next = heroNode; //連接上一個節點的next和新節點的數據}}public void list(){//先判斷鏈表是否為空if (head.next == null){return;}//因為頭結點不能動,因此我們需要一個輔助變量來遍歷HeroNode temp = head.next;while(true){//判斷鏈表是否為空if (temp == null){break;}//輸出節點信息System.out.println(temp);//將temp后移,一定要temp = temp.next;}}}//定義一個heroNode,每個heroNode就是一個節點 class HeroNode{public int no;public String name;public String nickName;public HeroNode next; //指向下一個節點//構造器public HeroNode(int no, String name, String nickname){this.no = no;this.name = name;this.nickName = nickname;}//為了顯示方便重寫toString@Overridepublic String toString() {return "HeroNode{" +"no=" + no +", name='" + name + '\'' +", nickName='" + nickName + '\'' +'}';} }

下面進行修改節點信息,根據no,no不能變,在SingleLinkedList中添加方法

//修改節點信息,根據no來修改,no不能改變public void updata(HeroNode newHeroNode){//判斷是否為空if (head.next == null){System.out.println("鏈表為空");return;}//找到需要修改的節點,根據no編號//定義一個輔助變量HeroNode temp = head.next;boolean flag = false;while (true){if (temp == null){break;//已經遍歷完}if (temp.no == newHeroNode.no){//找到flag = true;break;}temp = temp.next;}//判斷flag ,是否找到需要修改的if (flag){temp.name = newHeroNode.name;temp.nickName = newHeroNode.nickName;}else {//沒找到System.out.printf("沒有找到編號:%d 的節點,不能修改",newHeroNode.no);}}

測試代碼

//顯示(修改前)System.out.println("顯示(修改前)");linkedList.list();//測試修改節點的代碼HeroNode hero5 = new HeroNode(2, "chun", "chunchun");linkedList.updata(hero5);//顯示(修改后)System.out.println("顯示(修改后)");linkedList.list();

根據no來刪除節點,遍歷鏈表,找到no節點的前一個位置,讓no前一個位置的next指向no的后一個位置的數據

//刪除節點//思路:// 1.先找到需要刪除的這個節點的前一個節點,// 2.temp.next = temp.next.next// 被刪除的節點沒有引用指向,會被GC回收public void delete(int no){if (head.next == null){System.out.println("鏈表為空,不能刪除");return;}//找到需要修改的節點,根據no編號//定義一個輔助變量HeroNode temp = head;boolean flag = false;//標記是否找到待刪除的節點while (true){if (temp.next == null){ //節點遍歷完畢break;}if (temp.next.no == no){//找到節點noflag = true;break;}temp = temp.next; //temp后移}if (flag){//找到notemp.next = temp.next.next;}else {System.out.printf("鏈表里沒有no為:%d 的節點\n",no);}}

測試代碼

//刪除節點linkedList.delete(2);System.out.println("顯示刪除后");linkedList.list();linkedList.delete(2);System.out.println("顯示刪除后");linkedList.list();

總結

以上是生活随笔為你收集整理的数据结构 - 单链表(Linked List)实现在内存中实现数据以链表形式生成并根据序号排序的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。