单向链表
- 以节点的形式来存储,蕴含data和next
- 在内存中,链表的各个节点不肯定是间断存储的
- 链表分有头节点的链表和没有头节点的链表,头节点用head示意
- 代码次要是单向链表的增删改查
import java.util.Stack;public class Demo2 { public static void main(String[] args) { MyLinkedList linkedList = new MyLinkedList(); //创立用户节点,并插入链表 UserNode user1 = new UserNode(1, "一一"); UserNode user3 = new UserNode(3, "三三"); UserNode user2 = new UserNode(2, "二二"); linkedList.addNode(user1); linkedList.addNode(user3); linkedList.addNode(user2); linkedList.getList(); System.out.println(); //按id大小插入 System.out.println("有序插入"); UserNode user5 = new UserNode(5, "五五"); UserNode user4 = new UserNode(4, "四四"); linkedList.addByOrder(user5); linkedList.addByOrder(user4); linkedList.getList(); System.out.println(); //按id批改用户信息 System.out.println("批改用户信息"); UserNode userEdit = new UserNode(1, "新一一"); linkedList.changeNode(userEdit); linkedList.getList(); System.out.println(); //依据id删除用户信息 System.out.println("删除用户信息"); linkedList.deleteNode(new UserNode(3, "")); linkedList.getList(); System.out.println(); //取得倒数第几个节点 System.out.println("取得倒数节点"); System.out.println(linkedList.getUserByRec(2)); System.out.println(); //翻转链表 System.out.println("翻转链表"); MyLinkedList newLinkedList = linkedList.reverseList(); newLinkedList.getList(); System.out.println(); //顺叙遍历链表 System.out.println("倒序遍历链表"); newLinkedList.reverseTraverse(); }}/** * 创立链表 */class MyLinkedList { private UserNode head = new UserNode(0, ""); /** * 在链表尾部增加节点 * * @param node 要增加的节点 */ public void addNode(UserNode node) { //创立一个辅助节点,用于遍历 UserNode temp = head; //找到最初一个节点 while (true) { //temp是尾节点就进行循环 if (temp.next == null) { break; } //不是尾结点就向后挪动 temp = temp.next; } temp.next = node; } /** * 遍历链表 */ public void getList() { System.out.println("开始遍历链表"); if (head.next == null) { System.out.println("链表为空"); } //创立辅助节点 UserNode temp = head.next; while (true) { //遍历实现就进行循环 if (temp == null) { break; } System.out.println(temp); temp = temp.next; } } /** * 按id程序插入节点 * * @param node */ public void addByOrder(UserNode node) { //如果一个节点都没用,直接插入 if (head.next == null) { head.next = node; return; } UserNode temp = head; while (temp.next != null && temp.next.id < node.id) { temp = temp.next; } //当指标node的id最大时,则不会执行if中的语句 if (temp.next != null) { node.next = temp.next; } temp.next = node; } /** * 依据id来批改节点信息 * * @param node 批改信息的节点 */ public void changeNode(UserNode node) { UserNode temp = head; //遍历链表,找到要批改的节点 while (temp.next != null && temp.id != node.id) { temp = temp.next; } //如果temp曾经是最初一个节点,判断id是否相等 if (temp.id != node.id) { System.out.println("未找到该用户的信息,请先创立该用户的信息"); return; } //批改用户信息 temp.name = node.name; } /** * 依据id删除节点,找到待删除节点的上一个节点 * * @param node 要删除的节点 */ public void deleteNode(UserNode node) { if (head.next == null) { System.out.println("链表为空"); return; } UserNode temp = head; //遍历链表,找到要删除的节点 while (temp.next != null && temp.next.id != node.id) { temp = temp.next; } //判断最初一个节点的是否要删除的节点 if (temp.next.id != node.id) { System.out.println("请先插入该用户信息"); return; } //删除该节点 temp.next = temp.next.next; } /** * 失去倒数的节点 * * @param index 倒数第几个数 * @return */ public UserNode getUserByRec(int index) { if (head.next == null) { System.out.println("链表为空!"); } UserNode temp = head.next; //记录链表长度 //所以length初始化为1 int length = 1; while (temp.next != null) { temp = temp.next; length++; } if (length < index) { throw new RuntimeException("链表越界"); } //假如有五个,倒数第一个相当于负数第五个 temp = head.next; for (int i = 0; i < length - index; i++) { temp = temp.next; } return temp; } /** * 翻转链表 * * @return 反转后的链表 */ public MyLinkedList reverseList() { //链表为空或者只有一个节点,无需翻转 if (head.next == null || head.next.next == null) { System.out.println("无需翻转"); } MyLinkedList newLinkedList = new MyLinkedList(); //用于保留正在遍历的节点 UserNode temp = head.next; //用于保留正在遍历节点的下一个节点 UserNode nextNode = temp.next; while (true) { //插入新链表 temp.next = newLinkedList.head.next; newLinkedList.head.next = temp; //挪动到下一个节点 temp = nextNode; nextNode = nextNode.next; if (temp.next == null) { //插入最初一个节点 temp.next = newLinkedList.head.next; newLinkedList.head.next = temp; head.next = null; return newLinkedList; } } } public void reverseTraverse() { if (head == null) { System.out.println("链表为空"); } UserNode temp = head.next; //创立栈,用于寄存遍历到的节点 Stack<UserNode> stack = new Stack<>(); while (temp != null) { stack.push(temp); temp = temp.next; } while (!stack.isEmpty()) { System.out.println(stack.pop()); } }}/** * 定义节点 */class UserNode { int id; String name; //用于保留下一个节点的地址 UserNode next; public UserNode(int id, String name) { this.id = id; this.name = name; } @Override public String toString() { return "UserNode{" + "id=" + id + ", name='" + name + '\'' + '}'; }}