LeetCode 刷题【24. 两两交换链表中的节点、25. K 个一组翻转链表】

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

自己做

解:直接置换

cpp 复制代码
/**
 * 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 *p = head;

        if(p == nullptr)                //空链表
            return nullptr;

        if(p->next == nullptr)          //只有一个元素
            return head;

        //先交换前两位
        ListNode *q = p->next; 
        ListNode *r = q->next;

        p->next = r;               
        q->next = p;
        head = q;       //更新头指针指向的结点
        
        q = p->next;
        if(q != nullptr)
            r = q->next;
        else
            r = nullptr;

        //三英杰就位,交换?启动!
        while(r != nullptr){
            //交换
            p->next = r;
            q->next = r->next;
            r->next = q;

            //更新pqr位置
            p = q;
            q = p->next;

            if(q == nullptr)
                break;

            r = q->next;

        }
        
        return head;

    }
};

25. K 个一组翻转链表

自己做

解:头插反转合并

cpp 复制代码
/**
 * 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* reverseKGroup(ListNode* head, int k) {
        ListNode *p = head;
        ListNode *r = new ListNode();       //头插
        
        //统计链表长度
        int len = 0;
        while(p != nullptr){
            p = p->next;
            len++;
        }

        if(len < k)               //连一组k都凑不出来
            return head;
        
        if(k == 1)                  //不用交换
            return head;

        //先处理第一组
        p = head;                   //重置指针p(上面用来统计长度了)
        ListNode *q = p->next;
        ListNode *tail = p;                //重新排序好的链表尾指针
        for(int i = 0; i < k; i++){     
            p->next = r->next;          //头插
            r->next = p;

            p = q;
            if(p != nullptr)
                q = q->next;
        }

        head = r->next;                 //重置头结点

        len -= k;                       //长度更新(这个长度表示剩下要排序的元素个数)

        while(len >= k){
            r->next = nullptr;          //重置头插链表
            ListNode *end = p;          //end指向头插链表的尾部

            for(int i = 0; i < k; i++){     
                p->next = r->next;          //头插
                r->next = p;

                p = q;
                if(p != nullptr)
                    q = q->next;
            }

            //现在r指向的头插链表又填装好了,p也指向了下一组的起始位置
            tail->next = r->next;           //反转的部分和原先的链表合并(head指向的)
            tail = end;                     //更新tail

            len -= k;                   //更新长度
        }

        //凑不成一组的部分合并
        tail->next = p;

        return head;

    }
};
相关推荐
NeDon11 小时前
[OJ]数据结构:移除链表元素
c语言·数据结构·算法·链表
刃神太酷啦11 小时前
C++ list 容器全解析:从构造到模拟实现的深度探索----《Hello C++ Wrold!》(16)--(C/C++)
java·c语言·c++·qt·算法·leetcode·list
承渊政道11 小时前
一文彻底搞清楚链表算法实战大揭秘和双向链表实现
c语言·数据结构·算法·leetcode·链表·visual studio
sali-tec11 小时前
C# 基于halcon的视觉工作流-章69 深度学习-异常值检测
开发语言·图像处理·算法·计算机视觉·c#
努力写代码的熊大11 小时前
手撕AVL树:从理论到实践,掌握插入操作的完美平衡
算法
wbs_scy12 小时前
C++:二叉搜索树(BST)完全指南(从概念原理、核心操作到底层实现)
数据结构·算法
东华万里12 小时前
Release 版本禁用 assert:NDEBUG 的底层逻辑与效率优化
java·jvm·算法
liulilittle12 小时前
C++ CRTP 替代虚函数
数据结构·c++·算法
电摇小人12 小时前
莫比乌斯反演详细解说来啦!!!
数据结构·算法