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


    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
  • 相关阅读:
    官宣!零数科技正式完成品牌升级
    IDEA快捷键大全
    vue-treeselect及el-tree点击节点获取上级节点的数据
    【软件基础】Linq优化双重for循环、批量写入Excel以提升程序运行速度、常见代码优化方法
    洛谷P7441 Erinnerung
    如何制作一份优秀的简历?
    lvs负载均衡
    折幕变形制作-插件及软件
    聊一聊Java并发运行中的一些安全问题
    【算法与数据结构】24、LeetCode两两交换链表中的节点
  • 原文地址:https://blog.csdn.net/m0_52336986/article/details/126801907