【Java】数据结构—— 单链表和双链表
生活随笔
收集整理的這篇文章主要介紹了
【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é)點
看圖說話:
代碼:
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.
看圖說話:
代碼:
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é)點
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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ssm框架简单实现文件上传
- 下一篇: Java-封装