5-2 Reversing Linked List

点击打开链接

链表的逆转,定义一个结构体来模拟

#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<queue>
using namespace std;

struct node
{
    int next;
    int data;
}a[100005];
int prehead;   //指向这一次逆转的最后一个节点
int nexthead;  //指向下一次逆转的第一个节点
int Reverse(int head,int k)
{
    int cnt = 1;
    int newn = head;
    int old = a[newn].next;
    while(cnt < k)
    {
        int tmp = a[old].next;
        a[old].next = newn;
        newn=old;
        old = tmp;
        cnt++;
    }
    a[head].next = old;
    prehead=head;
    nexthead=old;
    return newn;
}
int main()
{
    int head,n,k;
    cin>>head>>n>>k;
    int add,data,next;
    if(head==-1)
    {
        printf("-1\n");
        return 0;
    }
    for(int i=0;i<n;i++)
    {
        cin>>add>>data>>next;
        a[add].next=next;
        a[add].data=data;
    }
    int p=head;
    int sum=0;
    while(p!=-1)
    {
        sum++;
        p = a[p].next;
    }
    head = Reverse(head,k);

    for(int i=1;i<sum/k;i++)
    {
        int preshead=prehead;
        a[preshead].next=Reverse(nexthead,k);
    }
    while( a[head].next != -1 )
    {
        printf("%05d %d ",head,a[head].data);
        printf("%05d\n" ,a[head].next);
        head = a[head].next;
    }
    printf("%05d %d -1",head,a[head].data);
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值