• 数据结构算法合集——链表篇


    day01 剑指 Offer 24. 反转链表

    双指针

    /**
     * Definition for singly-linked list.
     * function ListNode(val) {
     *     this.val = val;
     *     this.next = null;
     * }
     */
    /**
     * @param {ListNode} head
     * @return {ListNode}
     */
    var reverseList = function(head) {
    //使用一个cur节点保存head节点
        let cur = head
        let pre = null
        while(cur) {
        //使用一个next节点保存cur节点的下一个节点
        //因为接下来要改变cur节点的指针指向了
            let next = cur.next
            //这步骤就相当于翻转操作
            cur.next = pre
            //移动pre节点
            pre = cur
            //移动cur节点
            cur = next
        }
        return pre
    };
    
    • 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

    递归法

    和双指针法思路是一样的,只是写法有些不同

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode(int x) : val(x), next(NULL) {}
     * };
     */
    class Solution {
    public:
        ListNode* reverse(ListNode* cur, ListNode* pre) {
            if(!cur) {
                return pre;
            }
            ListNode* temp = cur->next;
            cur->next = pre;
            return reverse(temp, cur);
        }
        ListNode* reverseList(ListNode* head) {
            return reverse(head, NULL);
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    24. 两两交换链表中的节点

    设置一个dummy节点直接模拟

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode() : val(0), next(nullptr) {}
     *     ListNode(int x) : val(x), next(nullptr) {}
     *     ListNode(int x, ListNode *next) : val(x), next(next) {}
     * };
     */
    class Solution {
    public:
        ListNode* swapPairs(ListNode* head) {
            ListNode* dummyHead = new ListNode(0);
            dummyHead->next = head;
            ListNode* cur = dummyHead;
            while(cur->next != nullptr && cur->next->next != nullptr) {
                ListNode* t1 = cur->next;
                ListNode* t2 = cur->next->next->next;
                cur->next = cur->next->next;
                cur->next->next = t1;
                cur->next->next->next = t2;
                cur = cur->next->next;
            }
            return dummyHead->next;
        }
    };
    
    • 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

    19. 删除链表的倒数第 N 个结点

    快慢指针

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode() : val(0), next(nullptr) {}
     *     ListNode(int x) : val(x), next(nullptr) {}
     *     ListNode(int x, ListNode *next) : val(x), next(next) {}
     * };
     */
    class Solution {
    public:
        ListNode* removeNthFromEnd(ListNode* head, int n) {
           ListNode* dummyHead = new ListNode(0);
           dummyHead->next = head;
           ListNode* slow = dummyHead;
           ListNode* fast = dummyHead;
           while(n-- && fast != NULL) {
               fast = fast->next;
           }
           fast = fast->next;
           while(fast) {
               fast = fast->next;
               slow = slow->next;
           }
           slow->next = slow->next->next;
           return dummyHead->next;
        }
    };
    
    • 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
  • 相关阅读:
    电池电动汽车的健康状态 SOH 和充电状态 SOC 估计
    shell动态生成.sql文件的方法进阶2
    windows查找管理端口常用命令
    [Spring] Spring5——IOC 简介(二)
    0915(053天 反射机制)
    linux 监控CPU利用率
    【CSS】H7_浮动
    4、AQS之ReentrantReadWriteLock
    C# OpenCvSharp 图片模糊检测(拉普拉斯算子)
    AlphaControls控件TsRadioGroup的使用
  • 原文地址:https://blog.csdn.net/m0_52336986/article/details/126801907