链表的定义
链表是有序的列表,它在内存中的存储不一定是连续的,有如下几个特点:
关于链表的几个操作
以下定义都是基于带头节点的链表去实现的(头节点的number值为0)
链表的定义:
| 1 2 3 4 5 6 7 8 9 | ```
public class Node { public int number; public Node next; public Node(int number) { this.number = number; } }
| -------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- |
#### [](#%E9%93%BE%E8%A1%A8%E7%9A%84%E5%9F%BA%E7%A1%80%E6%93%8D%E4%BD%9C%EF%BC%88%E5%A2%9E%E5%88%A0%E6%94%B9%E6%9F%A5%EF%BC%89 "链表的基础操作(增删改查)")链表的基础操作(增删改查)
| ```
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
``` | ```
public class TestLinkedList { //头节点 private static Node head = new Node(0); public static void main(String[] args) { Node node1 = new Node(1); Node node2 = new Node(2); Node node3 = new Node(3); Node node4 = new Node(4); Node node5 = new Node(5); addByOrder(node1); addByOrder(node2); addByOrder(node4); addByOrder(node3); addByOrder(node5); display(head); // modifyNumber(5,100); // display(head); // System.out.println("删除节点之前的长度为:"+length(head)); // // delete(3); // display(head); // // System.out.println("删除节点之后的长度为:"+length(head)); // Node revertNode = revert(head); // display(revertNode); revertPrint(head); } /** * 向链表中添加元素 * @param node */ public static void add(Node node){ Node temp = head; while (temp.next != null){ temp = temp.next; } temp.next = node; } /** * 按照元素大小值排列添加元素 * @param node */ public static void addByOrder(Node node){ boolean flag = false; Node temp = head; while (temp.next != null){ if (temp.next.number > node.number){ flag = true; break; } temp = temp.next; } if (flag){ Node nextNode = temp.next; temp.next = node; node.next = nextNode; }else{ temp.next = node; } } /** * 打印链表中的元素 * @param node */ public static void display(Node node){ if (node == null){ System.out.println("链表为空"); } Node temp = node.next; while (temp != null ){ System.out.print(temp.number + ","); temp = temp.next; } System.out.println(); } /** * 修改链表中指定索引的node的值 * @param index 要修改的索引下标 * @param newNum 需要修改的新值 */ public static void modifyNumber(int index ,int newNum){ Node temp = head; int indexSum = 1; while (temp.next != null){ if (index == indexSum){ temp.next.number = newNum; break; } indexSum ++; temp = temp.next; } } /** * 删除一个node * @param index 需要删除的索引下标 */ public static void delete(int index){ Node temp = head; int indexSum = 1; while (temp.next != null){ if (index == indexSum){ temp.next = temp.next.next; break; } indexSum ++; temp = temp.next; } } /** * 计算链表的长度 * @param node * @return */ public static int length(Node node){ int result = 0; while (node.next != null){ result++; node = node.next; } return result; } }
``` |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
##### [](#%E5%B0%86%E9%93%BE%E8%A1%A8%E5%8F%8D%E8%BD%AC "将链表反转")将链表反转
| ```
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
``` | ```
/** * 将链表反转 * @return */ public static Node revert(Node node){ if (node.next == null){ return null; } Node revertNode = new Node(0); Node cur = node.next; Node next = null; while (cur!=null){ //1.保存下一个节点指针 next = cur.next; //2.将当前节点的下一个节点指向新节点的下一个节点 cur.next = revertNode.next; //3.新节点的下一个节点指向当前节点 revertNode.next = cur; //4.当前节点为下一个节点,继续执行循环 cur = next; } return revertNode; }
``` |
| -------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
##### [](#%E5%B0%86%E9%93%BE%E8%A1%A8%E5%8F%8D%E5%90%91%E6%89%93%E5%8D%B0%EF%BC%88%E7%94%A8stack%E7%9A%84%E6%96%B9%E5%BC%8F%EF%BC%89 "将链表反向打印(用stack的方式)")将链表反向打印(用stack的方式)
| ```
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
``` | ```
/** * 将链表反向打印(stack方式) */ public static void revertPrint(Node node){ Node temp = node.next; Stack<Node> stack = new Stack<>(); while (temp!= null){ stack.push(temp); temp = temp.next; } while (stack.size() > 0){ Node pop = stack.pop(); System.out.println(pop.number); } }
``` |
| -------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
##### [](#%E9%80%92%E5%BD%92%E6%89%93%E5%8D%B0%E9%93%BE%E8%A1%A8 "递归打印链表")递归打印链表
| ```
1 2 3 4 5 6 7 8
``` | ```
public static void printDigui(Node node){ if (node.number != 0) { System.out.println(node.number); } if (node.next != null){ printDigui(node.next); } }
``` |
| ------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
##### [](#%E5%B0%86%E9%93%BE%E8%A1%A8%E5%8F%8D%E5%90%91%E6%89%93%E5%8D%B0%EF%BC%88%E7%94%A8%E9%80%92%E5%BD%92%E7%9A%84%E6%96%B9%E5%BC%8F%EF%BC%89 "将链表反向打印(用递归的方式)")将链表反向打印(用递归的方式)
| ```
1 2 3 4 5 6 7 8 9
``` | ```
//默认认为头节点的number的值为0 public static void printDigui(Node node){ if (node.next != null){ printDigui(node.next); } if (node.number != 0) { System.out.println(node.number); } }
``` |
| -------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
##### [](#%E5%B0%86%E9%93%BE%E8%A1%A8%E4%B8%A4%E4%B8%A4%E5%8F%8D%E8%BD%AC "将链表两两反转")将链表两两反转
| ```
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
``` | ```
/** * 链表两两反转 * @param node * @return */ public static Node revertNode(Node node){ Node head = node; while(head.next != null && head.next.next != null){ // 开始反转 Node next1 = head.next; Node next2 = next1.next; head.next = next2; next1.next = next2.next; next2.next = next1; // dummy 指针前移 head = next1; } return head; }
``` |
| -------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |