浙大数据结构02-线性结构3 Reversing Linked List_链表逆序

该博客主要讨论了一种链表操作问题,即给定一个常数K和一个单链表L,如何将链表中每隔K个节点进行反转。例如,给定链表1→2→3→4→5→6,若K=3,则输出结果为3→2→1→6→5→4;若K=4,则输出结果为4→3→2→1→5→6。博主通过输入链表节点信息,实现了链表的反转操作,并给出了详细的代码实现和测试样例。
摘要由CSDN通过智能技术生成

Given a constant K and a singly linked list L, you are supposed to reverse the links of every K elements on L. For example, given L being 1→2→3→4→5→6, if K=3, then you must output 3→2→1→6→5→4; if K=4, you must output 4→3→2→1→5→6.

Input Specification:

Each input file contains one test case. For each case, the first line contains the address of the first node, a positive N (≤105) which is the total number of nodes, and a positive K (≤N) which is the length of the sublist to be reversed. The address of a node is a 5-digit nonnegative integer, and NULL is represented by -1.

Then N lines follow, each describes a node in the format:

Address Data Next

where Address is the position of the node, Data is an integer, and Next is the position of the next node.

Output Specification:

For each case, output the resulting ordered linked list. Each node occupies a line, and is printed in the same format as in the input.

Sample Input:

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

结尾无空行

Sample Output:

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

结尾无空行

#include <bits/stdc++.h>
#define x first
#define y second
using namespace std;
typedef long long ll;
typedef struct
{
    int address,data,next;
} node;
int main()
{
//    system("chcp 65001");
    cin.tie(0);
    cout.tie(0);
//    freopen("C:/Users/zhaochen/Desktop/input.txt", "r", stdin);
    int head,i,address,n,K,pre;
    vector<node>list(100004);
    vector<node>rest;
    cin>>head>>n>>K;
    for(i=0; i<n; i++)
    {
        node t;
        cin>>t.address>>t.data>>t.next;
        list[t.address]=t;
    }
    vector<int>s;
    for(address=head; address != -1; address=list[address].next)
    {
        // 按顺序遍历一边,同时去除了多余的结点
        rest.push_back(list[address]);
    }
    for(i=0; i+K<=rest.size(); i+=K)
    {
        // 每K个结点翻转一次,无需处理next
        reverse(rest.begin()+i,rest.begin()+i+K);
    }
    for(i=0; i<rest.size()-1; i++)
    {
        printf("%05d %d %05d\n",rest[i].address,rest[i].data,rest[i+1].address);
    }
    printf("%05d %d -1",rest[i].address,rest[i].data);
//    for(address=head; address!=-1;)
//    {
//        s.push_back(address);           // 当前结点的地址
//        address=list[address].next;     // 下一结点的地址
//        if(s.size() == K)
//        {
//            if(s[0]==head)
//            {
//                head=s.back();
//            }
//            else
//            {
//                list[pre].next=s.back();
//            }
//            while(s.size()>1)
//            {
//                int top=s.back();
//                s.pop_back();
//                list[top].next=s.back();
//            }
//            list[s.back()].next=address;
//            pre=s.back();
//            s.clear();
//        }
//    }
//    for(address=head; list[address].next != -1;address=list[address].next)
//    {
//        printf("%05d %d %05d\n",address,list[address].data,list[address].next);
//    }
//    printf("%05d %d %d",address,list[address].data,list[address].next);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值