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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

【Java】数据结构—— 单链表和双链表

發(fā)布時間:2024/9/27 java 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Java】数据结构—— 单链表和双链表 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

    • 一、單鏈表
        • 前期準備:
      • 1、添加結(jié)點
      • 2、遍歷鏈表
      • 3、修改結(jié)點
      • 4、刪除結(jié)點
      • 5、獲取長度
      • 6、獲取鏈表的倒數(shù)第N個結(jié)點
      • 7、反轉(zhuǎn)鏈表
      • 8、反轉(zhuǎn)打印鏈表
      • 9、按照編號有序添加結(jié)點
      • 10、在指定位置插入結(jié)點
    • 二、雙鏈表
    • 雙向鏈表介紹
      • 1、添加結(jié)點
      • 2、修改結(jié)點
      • 3、刪除結(jié)點
      • 4、遍歷結(jié)點
      • 完整代碼
      • 測試代碼

一、單鏈表

前期準備:

1)創(chuàng)建一個學生結(jié)點

public class StudentNode {public int id;public int num;//學號public String name;//姓名public StudentNode next;//保存下一個結(jié)點public StudentNode(int id, int num, String name) {this.id = id;this.num = num;this.name = name;}@Overridepublic String toString() {return "StudentNode{" +"num=" + num +", name='" + name + '\'' +'}';} }

2)創(chuàng)建一個單鏈表

public class SingleLinkedList {private StudentNode head;/*** init a node of head* 初始化一個頭節(jié)點*/public SingleLinkedList( ) {head = new StudentNode(0, 0, "");}public StudentNode getHead() {return head;}"""""""""""}

1、添加結(jié)點

思路:

1.通過遍歷找到指向空的結(jié)點(temp.next=null)
2.修改指針的指向,也就是讓temp.next=null指向新的結(jié)點

看圖說話:

代碼:

public void add(StudentNode studentNode) {StudentNode temp = head;//while循環(huán)用于找到最后一個結(jié)點(null)while (true) {if (temp.next == null) {break;} else {temp = temp.next;//移動指針到下一個結(jié)點}}//studentNode 為新添加的結(jié)點temp.next = studentNode;}

2、遍歷鏈表

思路:

1、獲得頭結(jié)點
2、定義一個變量作為臨時變量
3、循環(huán)移動指針,知道為null停止

看圖說話:

代碼:

public void list() {if (head.next == null) {System.out.println("LinkedList is empty!");return;}StudentNode temp = head.next;while (true) {if (temp == null) {break;} else {System.out.println(temp);}temp = temp.next;}}

3、修改結(jié)點

代碼:

public void update(StudentNode studentNode) {if (head.next == null) {System.out.println("linkedList is empty!");return;}StudentNode temp = head.next;boolean flag = false;while (true) {if (temp == null) {break;}if (temp.id == studentNode.id) {flag = true;break;}temp = temp.next;}if (flag) {temp.num = studentNode.num;temp.name = studentNode.name;} else {System.out.println("Can't find :" + studentNode.id + " node!");}}

4、刪除結(jié)點

思路:

1.找到要刪除結(jié)點的前一個結(jié)點。
2.修改指針的指向,將要修改結(jié)點的前一個結(jié)點指針指向后一個結(jié)點。

看圖說話:

代碼:

public void remove(int id) {StudentNode temp = head;boolean flag = false;while (true) {if (temp.next == null) {break;}if (temp.next.id == id) {flag = true;break;}temp = temp.next;}if (flag) {temp.next = temp.next.next;} else {System.out.println("Can't find the node for id!");}}

5、獲取長度

思路:

將鏈表遍歷一遍即可。

代碼:

public int getLength(StudentNode head) {if (head.next == null) {return 0;}int length = 0;StudentNode cur = head.next;while (cur != null) {length++;cur = cur.next;}return length;}

6、獲取鏈表的倒數(shù)第N個結(jié)點

思路:

1.有多種方式:比如可以設置快慢指針可一遍就刪除倒數(shù)第N個結(jié)點。
2.

看圖說話:
代碼:

public StudentNode getLastIndexNode(StudentNode head, int index) {if (head.next == null) {return null;}int size = getLength(head);if (index <= 0 || index > size) {return null;}StudentNode cur = head.next;for (int i = 0; i < size - index; i++) {cur = cur.next;}return cur;}

7、反轉(zhuǎn)鏈表

代碼:

public void reverseList(StudentNode head) {if (head.next == null || head.next.next == null) {return;}StudentNode cur = head.next;StudentNode next = null;StudentNode reverseHead = new StudentNode(0, 0, "");while (cur != null) {next = cur.next;cur.next = reverseHead.next;reverseHead.next = cur;cur = next;}head.next = reverseHead.next;}

8、反轉(zhuǎn)打印鏈表

代碼:

public void reversePrint(StudentNode head) {if (head.next == null) {return;}Stack<StudentNode> stack = new Stack<StudentNode>();StudentNode cur = head.next;while (cur != null) {stack.push(cur);cur = cur.next;}while (stack.size() > 0) {System.out.println(stack.pop());}}

9、按照編號有序添加結(jié)點

代碼:

public void addByOrder(StudentNode studentNode) {//get a head nodeStudentNode temp = head;boolean flag = false;while (true) {if (temp.next == null) {break;}if (temp.next.id > studentNode.id) {break;} else if (temp.next.id == studentNode.id) {flag = true;break;}temp = temp.next;}if (flag) {System.out.println(studentNode.id + " is existed and can't add again!");} else {studentNode.next = temp.next;temp.next = studentNode;}}

10、在指定位置插入結(jié)點

二、雙鏈表

雙向鏈表介紹

前期準備:
1)創(chuàng)建一個學生結(jié)點

package com.qingfeng.linkedList.doubles;class StudentNode {public int id;//序號public int num;//學號public String name;//姓名public StudentNode next;//保存下一個結(jié)點public StudentNode pre;//保存前一個結(jié)點public StudentNode(int id, int num, String name) {this.id = id;this.num = num;this.name = name;}@Overridepublic String toString() {return "StudentNode{" +"num=" + num +", name='" + name + '\'' +'}';} }

2)創(chuàng)建一個雙向鏈表

public class DoubleLinkedList {/*** init a node of head*/private StudentNode head;public DoubleLinkedList( ) {head = new StudentNode(0, 0, "");}public StudentNode getHead() {return head;}--------functions---------- }

1、添加結(jié)點

代碼:

/*** create node of LinkedList** @param studentNode*/public void add(StudentNode studentNode) {StudentNode temp = head;while (true) {if (temp.next == null) {break;} else {temp = temp.next;}}temp.next = studentNode;/*** 1) temp.next.pre=temp;* 2) studentNode.pre=temp;*/studentNode.pre = temp;}

2、修改結(jié)點

代碼:

/*** update a node** @param studentNode a student object*/public void update(StudentNode studentNode) {if (head.next == null) {System.out.println("linkedList is empty!");return;}StudentNode temp = head.next;boolean flag = false;while (true) {if (temp == null) {break;}if (temp.id == studentNode.id) {flag = true;break;}temp = temp.next;}if (flag) {temp.num = studentNode.num;temp.name = studentNode.name;} else {System.out.println("Can't find :" + studentNode.id + " node!");}}

3、刪除結(jié)點

代碼:

/*** remove a node by id** @param id*/public void remove(int id) {StudentNode temp = head.next;boolean flag = false;while (true) {if (temp == null) {break;}if (temp.id == id) {flag = true;break;}temp = temp.next;}if (flag) {temp.pre.next = temp.next;if (temp.next != null) {temp.next.pre = temp.pre;}} else {System.out.println("Can't find the node for id!");}}

4、遍歷結(jié)點

代碼:

/*** order the list*/public void list() {if (head.next == null) {System.out.println("LinkedList is empty!");return;}StudentNode temp = head.next;while (true) {if (temp == null) {break;} else {System.out.println(temp);}temp = temp.next;}}

完整代碼

package com.qingfeng.linkedList.doubles;public class DoubleLinkedList {/*** init a node of head*/private StudentNode head;public DoubleLinkedList( ) {head = new StudentNode(0, 0, "");}public StudentNode getHead() {return head;}/*** create node of LinkedList** @param studentNode*/public void add(StudentNode studentNode) {StudentNode temp = head;while (true) {if (temp.next == null) {break;} else {temp = temp.next;}}temp.next = studentNode;/*** 1) temp.next.pre=temp;* 2) studentNode.pre=temp;*/studentNode.pre = temp;}/*** update a node** @param studentNode a student object*/public void update(StudentNode studentNode) {if (head.next == null) {System.out.println("linkedList is empty!");return;}StudentNode temp = head.next;boolean flag = false;while (true) {if (temp == null) {break;}if (temp.id == studentNode.id) {flag = true;break;}temp = temp.next;}if (flag) {temp.num = studentNode.num;temp.name = studentNode.name;} else {System.out.println("Can't find :" + studentNode.id + " node!");}}/*** remove a node by id** @param id*/public void remove(int id) {StudentNode temp = head.next;boolean flag = false;while (true) {if (temp == null) {break;}if (temp.id == id) {flag = true;break;}temp = temp.next;}if (flag) {temp.pre.next = temp.next;if (temp.next != null) {temp.next.pre = temp.pre;}} else {System.out.println("Can't find the node for id!");}}/*** order the list*/public void list() {if (head.next == null) {System.out.println("LinkedList is empty!");return;}StudentNode temp = head.next;while (true) {if (temp == null) {break;} else {System.out.println(temp);}temp = temp.next;}} }

測試代碼

代碼:

package com.qingfeng.linkedList.doubles;/*** test*/ @SuppressWarnings("all") public class DoubleLinkedListDemo {public static void main(String[] args) {StudentNode node1 = new StudentNode(1, 2018010210, "liuxin");StudentNode node2 = new StudentNode(2, 2018010211, "yanghai");StudentNode node3 = new StudentNode(3, 2018010212, "huxiaotian");DoubleLinkedList linkedList = new DoubleLinkedList();linkedList.add(node1);linkedList.add(node2);linkedList.add(node3);/*------------------------------------------------------------------------*/System.out.println("-------testList-------");linkedList.list();/*------------------------------------------------------------------------*/System.out.println("-------testAdd-------");StudentNode node4 = new StudentNode(4, 2018010212, "guoyoudao");linkedList.add(node4);linkedList.list();/*------------------------------------------------------------------------*/System.out.println("-------testRemove----");linkedList.remove(3);linkedList.list();/*------------------------------------------------------------------------*/System.out.println("-------testUpdate-----");StudentNode update = new StudentNode(4, 2018010212, "xiaoming");linkedList.update(update);linkedList.list();} }

運行結(jié)果:

-------testList------- StudentNode{num=2018010210, name='liuxin'} StudentNode{num=2018010211, name='yanghai'} StudentNode{num=2018010212, name='huxiaotian'} -------testAdd------- StudentNode{num=2018010210, name='liuxin'} StudentNode{num=2018010211, name='yanghai'} StudentNode{num=2018010212, name='huxiaotian'} StudentNode{num=2018010212, name='guoyoudao'} -------testRemove---- StudentNode{num=2018010210, name='liuxin'} StudentNode{num=2018010211, name='yanghai'} StudentNode{num=2018010212, name='guoyoudao'} -------testUpdate----- StudentNode{num=2018010210, name='liuxin'} StudentNode{num=2018010211, name='yanghai'} StudentNode{num=2018010212, name='xiaoming'}Process finished with exit code 0

總結(jié)

以上是生活随笔為你收集整理的【Java】数据结构—— 单链表和双链表的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。