C++: 链表回文结构/分割链表题解

目录

1.链表的回文结构

分析

代码

2.链表分割

​编辑分析

代码


1.链表的回文结构

分析

这道题的难点是空间复杂度为O(1)

结合逆置链表+找到链表的中间节点就可以解决了。

先找到链表的中间节点,再对中间节点的下一个节点进行逆置,返回值为最后一个节点。

再把数据的两端进行比较,遇到不等的或者第二个头走到空,就结束了。全等返回真,不等返回假。

代码

cpp 复制代码
/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};*/

class Partition {
public:
    ListNode* partition(ListNode* pHead, int x) {
        if (pHead == nullptr || pHead->next == nullptr) {
            return pHead;
        }

        ListNode* less_head = new ListNode(0); // 头节点,小于 x 的节点链表
        ListNode* less_tail = less_head; // 尾节点,用于连接小于 x 的节点

        ListNode* greater_equal_head = new ListNode(0); // 头节点,大于等于 x 的节点链表
        ListNode* greater_equal_tail = greater_equal_head; // 尾节点,用于连接大于等于 x 的节点

        ListNode* current = pHead;

        while (current != nullptr) {
            if (current->val < x) {
                less_tail->next = current;
                less_tail = less_tail->next;
            } else {
                greater_equal_tail->next = current;
                greater_equal_tail = greater_equal_tail->next;
            }

            current = current->next;
        }

        // 将两个链表连接起来
        less_tail->next = greater_equal_head->next;
        greater_equal_tail->next = nullptr;

        // 释放多余的头节点
        ListNode* new_head = less_head->next;

        delete less_head;
        delete greater_equal_head;

        return new_head;
    }
};

2.链表分割

分析

这题难点在于很容易把它和快排联系,然后美滋滋用快慢指针法,发现一堆坑。

这题思路是分割链表,分成小节点链表和大节点链表,并且始终保证小节点的指针指向小节点链表的尾部,大节点指针指向大节点链表的尾部,再让小节点指针的尾和大节点指针的头相连。

需要注意的是,这题要改变头节点,所以要设置哨兵位。最后也要记得把大节点指针的尾连上空指针。

代码

cpp 复制代码
/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};*/
class Partition {
public:
    ListNode* partition(ListNode* pHead, int x) {
        // write code here
        if(pHead==nullptr ||pHead->next==nullptr)
        {
            return pHead;
        }
        ListNode* cur = pHead;
        ListNode* smallhead = new ListNode(0);
        ListNode* smalltail =smallhead;
        ListNode* bighead = new ListNode(0);
        ListNode* bigtail = bighead;

        while(cur)
        {
            if(cur->val < x)
            {
                smalltail->next=cur;
                smalltail=smalltail->next;
            }
            else {
                bigtail->next = cur;
                bigtail=bigtail->next;
            }
            cur=cur->next;
        }

        smalltail->next = bighead->next;
        bigtail->next=nullptr;
        ListNode* newhead = smallhead->next;

        delete smallhead;
        delete bighead;
        return newhead;
    }
};
相关推荐
Scott9999HH1 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
2401_841495642 小时前
【操作系统】进程同步与互斥实验报告
c++·算法·操作系统·进程·并发·同步·互斥
fqbqrr2 小时前
2607C++,soui与安卓
c++·soui
码智社2 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海2 小时前
python 列表、元组、集合和字典
开发语言·python
萧瑟余晖3 小时前
JDK 26 新特性详解
java·开发语言
马优晨4 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
fqbqrr6 小时前
2607C++,使用微软detours勾挂工具
c++
人邮异步社区6 小时前
怎么把C语言学到精通?
c语言·开发语言
心平气和量大福大6 小时前
C#-WPF-控件-TextBox 数据绑定
开发语言·c#·wpf