• 算法与数据结构之链表


    链表的定义,相信大家都知道,这里就不赘述了只是链表分单向链表和双向链表,废话不多说,直接上代码

    链表节点的定义:

    1. public class Node {
    2. int val;
    3. Node next;
    4. Node pre;
    5. public Node(int val, Node next, Node pre) {
    6. this.val = val;
    7. this.next = next;
    8. this.pre = pre;
    9. }
    10. public Node(int val, Node next) {
    11. this.val = val;
    12. this.next = next;
    13. }
    14. public Node(int val) {
    15. this.val = val;
    16. }
    17. public Node() {
    18. }
    19. }

    打印链表的两种方式:

    1. //从前往后打印链表
    2. private void print(Node head) {
    3. while (head != null) {
    4. System.err.print(head.val);
    5. head = head.next;
    6. }
    7. System.err.println();
    8. }
    9. //从后往前打印链表
    10. private void print1(Node head) {
    11. while (head != null) {
    12. System.err.print(head.val);
    13. head = head.pre;
    14. }
    15. System.err.println();
    16. }

    翻转单向链表:核心思路是先断开连接,再将next指向前继节点,为了避免断开之后,找不到前继节点,需要用一个临时变量记录前继节点,在下一轮循环的时候把当前节点的next指向上一轮循环时的pre

    1. //翻转单链表
    2. private Node reverList(Node head) {
    3. Node pre = null;
    4. Node next = null;
    5. while (head != null) {//下一次进来的时候连上前一个节点,先记录下前一个节点,不能先断开了后面的节点,不然就找不到了
    6. next = head.next;
    7. head.next = pre;
    8. pre = head;
    9. head = next;
    10. }
    11. return pre;
    12. }
    13. @Test
    14. public void reverList() {
    15. Node one = new Node(2, new Node(3, new Node(4)));
    16. print(one);
    17. print(reverList(one));
    18. }

    翻转双向链表:思路同单向链表一样,只是多了一些判断

    1. //翻转双向链表
    2. private Node reverseDoubleList(Node head) {
    3. Node next = null;
    4. Node pre = null;
    5. while (head != null) {
    6. next = head.next;
    7. head.next = pre;
    8. head.pre = next;
    9. pre = head;
    10. head = next;
    11. }
    12. return pre;
    13. }
    14. @Test
    15. public void reverseDoubleList() {
    16. Node one = new Node(1);
    17. Node two = new Node(2);
    18. Node three = new Node(3);
    19. one.next = two;
    20. one.pre = null;
    21. two.next = three;
    22. two.pre = one;
    23. three.pre = two;
    24. three.next = null;
    25. print(one);
    26. print1(three);
    27. Node node = reverseDoubleList(one);
    28. print(node);
    29. print1(one);
    30. }

    从链表中删除指定的数据:

    1. //从单链表中删除指定的数据
    2. private Node removeList(Node head, int target) {
    3. Node pre = null;
    4. Node next = null;
    5. while (head != null) {//第一轮循环找到新的头结点,因为要删除的数据可能是第一个也可能是最后一个
    6. next = head.next;
    7. if (target != head.val) {
    8. break;
    9. }
    10. head = next;
    11. }
    12. next = pre = head;//
    13. while (next != null) {
    14. if (target == next.val) {
    15. next = next.next;
    16. pre.next = next;//相等的时候提前把pre和下一个连起来,这样下一个如果相等,只需要移动pre即可
    17. continue;
    18. }
    19. pre = next;//不相等的时候pre记录前一个节点,等到下一轮如果相等时候就可以把pre和next连上了
    20. next = next.next;
    21. }
    22. return head;
    23. }
    24. @Test
    25. public void removeList() {
    26. Node one = new Node(2, new Node(5, new Node(2, new Node(3, new Node(2)))));
    27. print(one);
    28. print(removeList(one, 2));
    29. }

  • 相关阅读:
    2015款奔驰B200车发动机故障灯异常点亮
    Powerdesigner支持的数据库系统
    Java技术栈中的核心组件:Spring框架的魔力
    JAVA基础(十四)
    2022杭电多校第一场
    金融市场数据至上:QuestDB 为您的数据提供最优解 | 开源日报 No.81
    阿里云技术专家杨泽强:弹性计算云上可观测能力构建
    使用正则表达式总结
    常见的最优化方法
    爬虫业务为什么一定要用住宅代理辅助
  • 原文地址:https://blog.csdn.net/qq_17805707/article/details/134222359