首页 > 其他分享 >pta重排链表(一个很清晰的实现,完全模拟链表的实现)

pta重排链表(一个很清晰的实现,完全模拟链表的实现)

时间:2024-09-17 11:34:50浏览次数:9  
标签:headStr string pta 链表 curStr fast 重排 neStr

#include <iostream>
#include <iomanip>
#include <unordered_map>
#include <string>

using namespace std;

const int N = 100010;
unordered_map<string, string> neStr;
unordered_map<string, int> eStr;
string headStr;
int n;

// 反转链表函数(字符串版本)
string reverse(string headStr) {
    string curStr = headStr, prevStr = "-1";
    while (curStr != "-1") {
        string tempStr = neStr[curStr];
        neStr[curStr] = prevStr;
        prevStr = curStr;
        curStr = tempStr;
    }
    return prevStr;
}

// 获取链表的中间节点
string getMidNode(string headStr) {
    if (neStr[headStr] == "-1") return headStr;
    string fast = headStr;
    string slow = headStr;
    while (neStr[fast] != "-1" && neStr[neStr[fast]] != "-1") {
        fast = neStr[neStr[fast]];
        slow = neStr[slow];
    }
    return slow;
}
void print(string l)
{
    string cur = l;
    while (cur != "-1")
    {
        cout << eStr[cur] << ' ';
        cur = neStr[cur];
    }
}
// 合并两个链表
void merge(string l1, string l2) {
   
    while (l1 != "-1" && l2 != "-1")
    {
        string n1 = neStr[l1], n2 = neStr[l2];
        neStr[l2] = l1;
        neStr[l1] = n2;
        l2 = n2;
        l1 = n1;
    }
}

int main() {
    cin >> headStr;
    cin >> n;
    for (int i = 1; i <= n; i++) {
        string addrStr, nextStr;
        int data;
        cin >> addrStr >> data >> nextStr;
        eStr[addrStr] = data;
        neStr[addrStr] = nextStr;
    }

    // 处理链表
    string mid = getMidNode(headStr);
    string nextPart = reverse(neStr[mid]);
    neStr[mid] = "-1"; // 断开链表的前半部分和后半部分


    /*cout << endl;
    print(headStr);
    cout << endl;
    print(nextPart);*/
    merge(headStr, nextPart);

    cout << endl;
    // 打印链表
    string cur = nextPart;
  
    while (cur != "-1") {
        cout << setw(5) << setfill('0') << cur << ' ' << eStr[cur] << ' ' << neStr[cur] << endl;
        cur = neStr[cur];
    }

    return 0;
}

标签:headStr,string,pta,链表,curStr,fast,重排,neStr
From: https://www.cnblogs.com/windzhao6/p/18417016

相关文章

  • C# 链表排序之插入排序
    在C#中,对于链表(如LinkedList<T>)进行排序,插入排序是一个可行的选择,尽管它可能不是最高效的排序方法,特别是当链表很长时。插入排序的基本思想是将链表分成已排序和未排序的两部分,初始时,已排序部分只包含链表的第一个元素,然后依次将未排序部分的元素插入到已排序部分的适当位置......
  • 5、循环双链表
    #include<stdio.h>#include<assert.h>#include<malloc.h>typedefintElemType;typedefstructNode{ElemTypedata;structNode*prior;structNode*next;}Node,*PNode;typedefstructDCList{PNodefirst;PNodelast......
  • 力扣热题100 - 二叉树:二叉树展开为链表
    题目描述:题号:114给你二叉树的根结点 root ,请你将它展开为一个单链表:展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。展开后的单链表应该与二叉树 先序遍历 顺序相同。解题思路:思路一:前序遍历后......
  • 链表
    链表可以\(O(1)\)插入/删除单向链表顾名思义只有后继指针邻接表我习惯叫做链式前向星,一般用来存储图,挺好理解的,这里直接给出存图的应用structedge{intto,nxt;}eg[M];inthead[N],egtot;voidadd(intu,intv){eg[++egtot].to=v;eg[eg......
  • 旋转链表
    旋转链表开头:对于链表的建立已经熟悉,那我们现在讲讲旋转链表的如何实现,当然旋转链表的建立是在已经掌握普通链表的基础上讲解。正文:旋转链表,顾名思义就是让链表“动起来”。即:使链表尾部最后的结点转到链表首部的位置。假设已经建立好一条6个结点的链表,它的初始状态如下图:我......
  • C语言:链表
    链表是一种常见的基础数据结构,它由一系列节点(Node)组成。每个节点包含两部分:数据域(存储数据)和指针域(存储下一个节点的地址)。链表的特点是元素在内存中不一定连续存储,而是通过指针连接起来。以下是链表的一些基本特点:动态性:链表的长度可以动态变化,不需要在创建时指定大小。灵活......
  • Day4||24.两两交换链表中的节点|19.删除链表的倒数第n个结点|面试题:链表相交|142.环形
    24.两两交换链表中的节点题目:24.两两交换链表中的节点-力扣(LeetCode)给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。图解思路首先,虚拟头结点挺方便链表进行增删改操作的。本题操作用到三......
  • 链表的快速排序(C/C++实现)
    一、前言大家在做需要排名的项目的时候,需要把各种数据从高到低排序。如果用的快速排序的话,处理数组是十分简单的。因为数组的存储空间的连续的,可以通过下标就可以简单的实现。但如果是链表的话,内存地址是随机分配的,不能像数组那样通过下标就直接实现。所以在这里给大家介绍......
  • 【JavaScript】LeetCode:707设计链表
    文章目录题目内容题目分析(1)获取第n个节点的值(2)头部插入节点(3)尾部插入节点(4)第n个节点前插入节点(5)删除第n个节点完整代码题目内容题目分析添加哨兵节点dummy。在第n个节点前插入节点时,应该找到第n-1个节点(即前一个节点),才能完成插入操作。在删除第n......
  • 4、循环单链表
    1、代码实现#include<stdio.h>#include<malloc.h>#include<assert.h>typedefintElemType;typedefstructNode{ElemTypedata;structNode*next;}Node,*PNode;typedefstructSCList{PNodefirst;PNodelast;intsize;}S......