浅谈:数据结构之双链表结构与代码模拟双链表的实现
生活随笔
收集整理的這篇文章主要介紹了
浅谈:数据结构之双链表结构与代码模拟双链表的实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
雙鏈表
本文是觀看尚硅谷韓老師數據結構與算法根據老師講解自己做的筆記,部分信息收集網絡
與單鏈表區別
邏輯上沒有區別。他們均是完成線性表的內容。主要的區別是結構上的構造有所區別。 對于單鏈表:
對于一個節點,有儲存數據的data。和next后驅節點(指針)。也就是這個單鏈表想要一些遍歷的操作都得通過前節點—>后節點。
對于雙鏈表:
對于一個節點,有些和單鏈表一樣有存儲數據的data,指向后方的next(指針)。它擁有單鏈表的所有操作和內容。但是他還有一個前驅節點pre(指針)。
雙向鏈表應用實例
雙向鏈表的操作分析和實現
使用帶 head 頭的雙向鏈表實現
管理單向鏈表的缺點分析:
時節點,總是找到 temp,temp 是待刪除節點的前一個節點(認真體會). 3) 分析了雙向鏈表如何完成遍歷,添加,修改和刪除的思路
對上圖的說明:
分析 雙向鏈表的遍歷,添加,修改,刪除的操作思路===》代碼實現
(1) 先找到雙向鏈表的最后這個節點
(2) temp.next = newHeroNode
(3) newHeroNode.pre = temp;
(1) 因為是雙向鏈表,因此,我們可以實現自我刪除某個節點
(2) 直接找到要刪除的這個節點,比如 temp
(3) temp.pre.next = temp.next
(4) temp.next.pre = temp.pre;
代碼解釋
package com.fs.demo_2020_07_14_DoubleLinkedList;import java.util.Stack;/*** 雙鏈表 演示*/ public class SingleDoubleLinkedListDemo {public static void main(String[] args) {//測試雙鏈表的增刪改查SingleDoubleLinkedList singleDoubleLinkedList = new SingleDoubleLinkedList();//創建節點System.out.println("---------添加4個節點(1,2,3,4)------------");Node node1 = new Node(1, "節點一");Node node2 = new Node(2, "節點二");Node node3 = new Node(3, "節點三");Node node4 = new Node(4, "節點四");//添加節點singleDoubleLinkedList.add(node1);singleDoubleLinkedList.add(node2);singleDoubleLinkedList.add(node3);singleDoubleLinkedList.add(node4);//顯示一把System.out.println("----------------測試遍歷雙向鏈表---------------");singleDoubleLinkedList.showLinkedList();System.out.println("---------------測試添加節點到雙鏈表的最后----------------------");Node node5 = new Node(5, "節點五");singleDoubleLinkedList.add(node5);//顯示一把singleDoubleLinkedList.showLinkedList();System.out.println("----------刪除節點為3的---------------");singleDoubleLinkedList.delNode(3);//顯示一把singleDoubleLinkedList.showLinkedList();System.out.println("-----------修改節點5的數據為測試節點----------");singleDoubleLinkedList.updateByNum(new Node(5,"測試節點"));//顯示一把singleDoubleLinkedList.showLinkedList();}}//創建一個類來模擬雙鏈表 class SingleDoubleLinkedList {//先初始化一個頭節點,頭節點不動,不存放具體信息private Node headNode = new Node(0, "頭結點");//生成一個get方法 返回頭結點,便于后面的測試方法拿頭結點測試public Node getHeadNode() {return headNode;}/*一 添加一個節點到雙鏈表的最后思路:*/public void add(Node node) {//拿到初始化的頭結點,作為輔助遍歷tempNode temp = headNode;//遍歷鏈表,找到最后的節點while (true) {//由圖解得知,單鏈表當遍歷到最后一個節點后,next存儲的值為null.因為沒有下一個節點可以存儲了if (temp.next == null) {//那就停止循環break;}//如果沒有找到最后,那就將temp后移一個節點temp = temp.next;}//循環結束后,所明temp到達最后一個節點了,那么就在最后一個節點后添加數據,將temp的next存儲添加的節點值temp.next = node;//將指針指到的這個節點的next指向添加的節點node.pre = temp;//將添加的節點的pre指向temp}/*三 修改節點信息,根據num來修改,但是num不能修改,只能修改num節點的name*/public void updateByNum(Node newNode) {//還是先判斷鏈表是否為空,判斷頭部節點的下一位是否為空if (headNode.next == null) {System.out.println("鏈表為空~~~");return;}//找到需要修改的節點,根據num號//定義一個輔助節點,這次就不是頭結點了,因為頭結點不能更改Node temp = headNode.next;//立一個flag,表示是否找到這個節點boolean flag = false;while (true) {if (temp == null) {break;//說明已經遍歷完了}if (temp.num == newNode.num) {//說明找到flag = true;break;}//每次循環指針指向下一個temp = temp.next;}//根據flag來判斷是否找到要修改的節點if (flag) {//說明找到,就將新節數據賦值給遍歷到的這個節點temp.name = newNode.name;} else {//沒有找到System.out.println("沒有找到編號為:" + newNode.num + "的節點~~~");}}/*刪除節點思路:由于是雙鏈表結構,我們temp輔助指針指向后可以進行自我刪除*/public void delNode(int num) {//判斷鏈表是否為空if (headNode.next == null) {System.out.println("鏈表為空~~~");return;}//同樣,標志是否摘掉帶刪除的節點Node temp = headNode.next;//立flagboolean flag = false;while (true) {if (temp == null) {//已經到達最后的節點break;}//因為現在temp指向誰,誰就是可以自我刪除if (temp.num == num) {//說明找到了刪除節點的前一個節點tempflag = true;break;}temp = temp.next;//循環后移}//判斷flagif (flag) {//說明找到,可以刪除temp.pre.next = temp.next;//先將temp前面的next指向temp.next,這樣temp就斷了一條//因為我們可能要刪除的是最后一條,最后一條的temp.next為空//那么temp.next== null.pre就 一定會空指針異常if (temp.next != null) {temp.next.pre = temp.pre;//在將temp的后一個的pre指向temp的pre.這樣又斷了一條,就實現了自我刪除}} else {System.out.println("您需要刪除的節點:" + num + "在鏈表中不存在~~~");}}/*顯示鏈表,遍歷查看*/public void showLinkedList() {//判斷鏈表否為空,if (headNode.next == null) {System.out.println("鏈表為空,請添加后查看~~~");return;}//同樣,頭結點不能動,作為輔助遍歷,從頭節點的下一位開始顯示,頭節點不顯示Node temp = headNode.next;while (true) {//判斷是否到最后一個節點了if (temp == null) {break;}//輸出節點信息System.out.println(temp);//將temp后移temp = temp.next;}}}//創建一個類類模擬雙鏈表節點 class Node {public int num;//當前節點數public String name;//給當前節點取個名字,模擬節點存儲的數據public Node next;//當前節點存儲的下一個節點信息public Node pre;//存儲當前節點的前一個節點//提供構造方法來初始化這個節點信息public Node(int num, String name) {this.num = num;this.name = name;}@Overridepublic String toString() {return "Node{" +"num=" + num +", name='" + name + '\'' +'}';} }測試控制臺結果
---------添加4個節點(1,2,3,4)------------ ----------------測試遍歷雙向鏈表--------------- Node{num=1, name='節點一'} Node{num=2, name='節點二'} Node{num=3, name='節點三'} Node{num=4, name='節點四'} ---------------測試添加節點到雙鏈表的最后---------------------- Node{num=1, name='節點一'} Node{num=2, name='節點二'} Node{num=3, name='節點三'} Node{num=4, name='節點四'} Node{num=5, name='節點五'} ----------刪除節點為3的--------------- Node{num=1, name='節點一'} Node{num=2, name='節點二'} Node{num=4, name='節點四'} Node{num=5, name='節點五'} -----------修改節點5的數據為測試節點---------- Node{num=1, name='節點一'} Node{num=2, name='節點二'} Node{num=4, name='節點四'} Node{num=5, name='測試節點'}總結
以上是生活随笔為你收集整理的浅谈:数据结构之双链表结构与代码模拟双链表的实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: spring核心配置文件引入外部prop
- 下一篇: spring的注解开发@Componen