首页 > 其他分享 >一千题,No.0039(反转链表)

一千题,No.0039(反转链表)

时间:2024-05-30 20:28:37浏览次数:26  
标签:一千 No.0039 int list next 链表 vec address data

给定一个常数 K 以及一个单链表 L,请编写程序将 L 中每 K 个结点反转。例如:给定 L 为 1→2→3→4→5→6,K 为 3,则输出应该为 3→2→1→6→5→4;如果 K 为 4,则输出应该为 4→3→2→1→5→6,即最后不到 K 个元素不反转。

输入格式:

每个输入包含 1 个测试用例。每个测试用例第 1 行给出第 1 个结点的地址、结点总个数正整数 N (≤105)、以及正整数 K (≤N),即要求反转的子链结点的个数。结点的地址是 5 位非负整数,NULL 地址用 −1 表示。

接下来有 N 行,每行格式为:

Address Data Next

其中 Address 是结点地址,Data 是该结点保存的整数数据,Next 是下一结点的地址。

输出格式:

对每个测试用例,顺序输出反转后的链表,其上每个结点占一行,格式与输入相同。

输入样例:

00100 6 4
00000 4 99999
00100 1 12309
68237 6 -1
33218 3 00000
99999 5 68237
12309 2 33218

输出样例:

00000 4 33218
33218 3 12309
12309 2 00100
00100 1 99999
99999 5 68237
68237 6 -1

解题思路:

自己写了一坨还有两个样例过不了:

#include <bits/stdc++.h>

using namespace std;

typedef struct point
{
    string _address;
    int _data;
    struct point *_next;
}*List;

struct vec
{
    int _data_vec;
    string _address_vec;
    string _next_vec;
};

int main()
{
    //初始化
    List head = new point();
    cin >> head->_address;
    head->_next = NULL;

    //总数
    int num;
    cin >> num;

    //反转数
    int n;
    cin >> n;

    //记录输入
    vector<vec> v;
    while(num--)
    {
        vec p;
        cin >> p._address_vec >> p._data_vec >> p._next_vec;
        v.push_back(p);
    }

    for(auto &elem : v)
    {
        if(elem._address_vec == head->_address)
        {
            head->_data = elem._data_vec;
            break;
        }
    }

    List t = head;
    while(true)
    {
        List new_point = new point();
        bool b = true;
        for(auto &elem : v)
        {
            if(elem._address_vec == t->_address)
            {
                new_point->_address = elem._next_vec;
                if(elem._next_vec == "-1")
                {
                    b = false;
                    break;
                }
                break;
            }
        }
        if(!b)
        {
            break;
        }
        for(auto &elem  : v)
        {
            if(elem._address_vec == new_point->_address)
            {
                new_point->_data = elem._data_vec;
                new_point->_next = NULL;
                break;
            }
        }
        new_point->_next = t->_next;
        t->_next = new_point;
        t = new_point;
    }

    deque<pair<int,string>> d;
    t = head;
    while(n--)
    {
        d.push_front({t->_data,t->_address});
        t = t->_next;
    }
    while(t && t->_next != NULL)
    {
        d.push_back({t->_data,t->_address});
        t = t->_next;
    }
    if(t)
    {
        d.push_back({t->_data,t->_address});
    }

    for(auto &elem : d)
    {
        if(elem.first != d.begin()->first)
        {
            cout << elem.second << "\n" << elem.second << " " << elem.first << " ";
        }
        if(elem.first == d.begin()->first)
        {
            cout << elem.second << " " << elem.first << " ";
        }
    }
    cout << -1;

    return 0;
}

 后来发现自己连题都没看完,是每n次反转一遍,不是反转前n次

在看完大佬的题解后模仿写了一遍过了:

1,设置3个数组data,next,list

data存储数据,next存储下一个节点的地址,list存储链表,三个数组均以地址的形式存储(例:10001地址的节点全部存储于data[10001],next[10001],并且在list中存储10001表示该节点)

2,每n次反转一次

3,输出

c++代码如下:

#include <bits/stdc++.h>

using namespace std;

int main() {
    int data[100005], next[100005], list[100005];
    int temp, sum, n;
    cin >> temp >> sum >> n;
    for (int i = 0; i < sum; ++i) {
        int num;
        cin >> num;
        cin >> data[num] >> next[num];
    }

    //创建链表
    int t = 0;
    while (temp != -1) {
        list[t++] = temp;
        temp = next[temp];
    }

    //每n次旋转一次
    for (int i = 0; i < (t - t % n); i += n)
    {
        reverse(list + i, list + i + n);
    }

    //输出
    for (int i = 0; i < t - 1; i++)
    {
        printf("%05d %d %05d\n", list[i], data[list[i]], list[i + 1]);//正则表达式
    }
    //最后一个节点需要特殊输出
    printf("%05d %d -1", list[t - 1], data[list[t - 1]]);
    return 0;
}

标签:一千,No.0039,int,list,next,链表,vec,address,data
From: https://blog.csdn.net/2301_76783671/article/details/139332652

相关文章

  • 链表9(优化版)7-9 sdut-C语言实验-约瑟夫问题
    7-9sdut-C语言实验-约瑟夫问题分数20全屏浏览切换布局作者 马新娟单位 山东理工大学n个人想玩残酷的死亡游戏,游戏规则如下:n个人进行编号,分别从1到n,排成一个圈,顺时针从1开始数到m,数到m的人被杀,剩下的人继续游戏,活到最后的一个人是胜利者。请输出最后一个人的编号......
  • 环形链表II
    前两天一直在debug,今天才有时间好好刷一下力扣,今天在代码随想录上看到环形链表,链接如下:https://leetcode.cn/problems/linked-list-cycle-ii/description/这道题官方有两种解法,一种是相对比较简单的哈希表,还有一种是利用数学计算出他们的规律进而解题。首先说第二种,在示例中......
  • leetCode.82. 删除排序链表中的重复元素 II
    leetCode.82.删除排序链表中的重复元素II题目思路:代码classSolution{public:ListNode*deleteDuplicates(ListNode*head){autodummy=newListNode(-1);dummy->next=head;autop=dummy;while(p->next){......
  • 探索数据结构:单链表的实践和应用
    ......
  • 2-链表-41-两两交换链表中的节点-LeetCode24
    2-链表-41-两两交换链表中的节点-LeetCode24参考:代码随想录LeetCode:题目序号24更多内容欢迎关注我(持续更新中,欢迎Star✨)Github:CodeZeng1998/Java-Developer-Work-Note技术公众号:CodeZeng1998(纯纯技术文)生活公众号:好锅(Lifeismorethancode)CSDN:CodeZeng1998......
  • 数据结构-单向链表的实现(c语言)
    链表的定义:链表是由一系列的结点组成的,每个结点包含两个域,分别是指针域(*next)与数据域(data)。单向链表的实现//.h文件#ifndeDXLB_H#defineDXLB_H//定义结点结构体typedefstructLINKNODE{structLINKNODE*next;//指向下一个结点的指针intdata;......
  • 反转链表
    leetcode:206.需求:反转链表原链表:graphLRA-->B-->C-->D-->null反转后:graphRLD-->C-->B-->A-->null graphLR D-->C-->B-->A-->null双指针法:/***Definitionforsingly-linkedlist.*publicclassListNode{*......
  • 【LeetCode算法】第83题:删除排序链表中的重复元素
    目录一、题目描述二、初次解答三、官方解法四、总结一、题目描述二、初次解答1.思路:双指针法,只需遍历一遍。使用low指向前面的元素,high用于查找low后面与low不同内容的节点。将具有不同内容的节点链接在low后面,实现重复元素的删除。2.代码:/***Definitionfor......
  • 实现双链表各种基本运算的算法
    实验三:实现双链表各种基本运算的算法一、实验目的与要求目的:领会双链表存储结构和掌握双链表中各种基本运算算法设计。内容:编写一个程序dlinklist.cpp,实现双链表的各种基本运算和整体建表算法(假设链表的元素类型ElemType为char),并在此基础上设计一个程序exp2-3.cPp,......
  • 设计链表
    leetcode:707题这题基本涵盖链表的的常用操作,获取第n个节点的值(从零开始)头部插入节点尾部插入节点第n个节点前插入节点删除第n个节点C#:publicclassMyLinkedList{publicintcount{get;set;}privateNodedummyHead;publicMyLinkedList(){......