• 看一下链表结构


    序、慢慢来才是最快的方法。

    背景

    链表(Linked List)
    链表是一种常见的基础数据结构,是一种线性表。与顺序表不同的是,链表中的每个节点不是顺序存储的,而是通过节点的指针域指向到下一个节点。

    1.链表的优缺点

    2.链表的类型

    单链表、双链表、循环链表、静态链表。

    1.单链表

    • element:用来存放元素
    • next:用来指向下一个节点元素
    • 通过每个结点的指针指向下一个结点从而链接起来的结构,最后一个节点的next指向null。

    代码示例:

    1. //单向链表
    2. class SingleLinkedList{
    3. //先初始化一个头节点, 头节点不要动, 不存放具体的数据
    4. private Node head = new Node("");
    5. //添加节点
    6. public void add(Node node){
    7. Node temp = head;
    8. while (true){
    9. if(temp.next == null){
    10. break;
    11. }
    12. temp = temp.next;
    13. }
    14. temp.next = node;
    15. }
    16. // 插入新节点到链表的头部
    17. public void insertAtHead(String data) {
    18. Node newNode = new Node(data);
    19. if (head != null) {
    20. //新链表的next直接指向head即可。
    21. newNode.next = head;
    22. }
    23. head = newNode;
    24. }
    25. //删除节点
    26. public void del(String element) throws Exception {
    27. Node temp = head;
    28. boolean flag = false; // 标志是否找到待删除节点的
    29. while (true){
    30. if(temp.next == null){//最后一个节点
    31. break;
    32. }
    33. if(temp.next.element == element){
    34. flag = true;
    35. break;
    36. }
    37. temp = temp.next;
    38. }
    39. if(flag){
    40. temp.next = temp.next.next;
    41. } else {
    42. throw new Exception("没有找到要删除的节点");
    43. }
    44. }
    45. //定义节点
    46. class Node{
    47. public String element;//用来存放元素
    48. public Node next; //指向下一个节点
    49. public Node(String element) {
    50. super();
    51. this.element = element;
    52. }
    53. }
    54. }

    单链表反转

    反转链表问题在面试中出现频率 非常非常高,相信有过几次面试经验的同学都会同意这个观点。

    解法1:递归
    1. //递归解法
    2. private Node reversetList(Node node) {
    3. if (node == null || node.next == null) {
    4. return head;
    5. }
    6. Node nodePre= reversetList(node);
    7. node.next.next = node.next;
    8. node.next = null;
    9. return nodePre;
    10. }
    解法2:迭代
    1. //单链表反转 迭代
    2. private Node reversetList1(Node node) {
    3. //如果当前链表为null,或者只有一个节点,则无需反转
    4. if (node == null && node.next == null) {
    5. return node;
    6. }
    7. //定义一个辅助的指针(变量),帮助我们遍历原来的链表
    8. Node cur = node.next;
    9. Node next = null;// 指向当前节点[cur]的下一个节点
    10. Node reverseNode = new Node("");
    11. while (cur != null) {
    12. next = cur.next;//先暂时保存当前节点的下一个节点,因为后面需要使用
    13. cur.next = reverseNode.next;///将cur 的下一个节点指向新的链表的最前端
    14. reverseNode = cur;将cur 连接到新的链表上
    15. cur = next;//让cur 后移
    16. }
    17. return reverseNode;
    18. }

    2.双链表

    单向链表的好处很多,虽然单链表能 100% 解决逻辑关系为 "一对一" 数据的存储问题,但在解决某些特殊问题时,单链表并不是效率最优的存储结构。比如说,如果算法中需要大量地找某指定结点的前趋结点,使用单链表无疑是灾难性的,因为单链表更适合 "从前往后" 找,而 "从后往前" 找并不是它的强项,因此我们就有了双向链表这个东西,双向链表顾名思义就是链表的高级版,他与单向链表有所不同的一点在于在具有尾巴结点,并且双向链表的每一个结点都会有两个指向,一个指向前面的结点,一个指向后面的结点,当然头结点的前端指向为null,后结点的后端指向为null。
     

    element、pre、next 跟前面的一样。

    第一个节点的pre指向最后一个节点,最后一个节点的next指向第一个节点,形成一个环。

    代码示例

    1. public ListNode head;
    2. public ListNode last;
    3. public TowWayNodeList(int num){
    4. this.head = new ListNode(num);
    5. this.last = this.head;
    6. }
    7. //头插法
    8. public void addFirst(int num){
    9. ListNode node = new ListNode(num);
    10. if(head == null){
    11. this.head = node;
    12. this.last = node;
    13. }else{
    14. node.next = this.head;
    15. this.head.prev = node;
    16. this.head = node;
    17. }
    18. }
    19. //尾插发
    20. public void addLast(int data){
    21. ListNode node = new ListNode(data);
    22. if(head == null){
    23. this.head = node;
    24. this.last = node;
    25. }else{
    26. this.last.next = node;
    27. node.prev = this.last;
    28. this.last = node;
    29. }
    30. }

    参考

    数据结构与算法 #1 链表问题总结 - 掘金

    leetcode 206 号算法题:反转单链表【数据结构与算法】_哔哩哔哩_bilibili

    力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

    Java实现双向链表_双向链表java实现_跑不死的程序员的博客-CSDN博客

  • 相关阅读:
    Selenium教程:自动化浏览器测试工具
    非平稳信号分析和处理、STFT的瞬时频率研究(Matlab代码实现)
    网络安全(黑客)自学
    新一日分享
    python基础之字典的访问
    MySQL 是什么有什么用处下载和安装教程等值连接数据库基础知识怎么读取增删改短语优化的几种方法
    基于jquery+html开发的json格式校验工具
    以太网_底层
    洛谷刷题C语言:FILIP、修改数组、Fun、Šifra、Erinnerung
    【玩物立志-scratch少儿编程】骑上小摩托(动态背景+摄像头控制操作)
  • 原文地址:https://blog.csdn.net/qq_37492806/article/details/133788002