[C++][链表]Reversing Linked List

1.题目

2.代码

#include<stdio.h>
#include<stdlib.h>
#include<string>
#include<map>
#include<vector>
#include<iostream>
using namespace std;
typedef struct LNode *List;
struct LNode
{
    string entryad;
    string outad;
    int data;
    List next;
};
List reverseL(List head,int k)
{
    int cnt=1;
    List phead,pre,pcur;
    phead=head;
    pre=phead->next;
    pcur=pre->next;
    while(cnt<k)
    {
        if(pcur->next==NULL){
            pre->next=NULL;
            pre->outad=pcur->outad;
            pcur->next=phead->next;
            pcur->outad=phead->next->entryad;
            phead->next=pcur;
            phead->outad=pcur->entryad;
            cnt+=1;
        }
        else{
            pre->next=pcur->next;
            pre->outad=pcur->next->entryad;
            pcur->next=phead->next;
            pcur->outad=phead->next->entryad;
            phead->next=pcur;
            phead->outad=pcur->entryad;
            pcur=pre->next;
            cnt+=1;
        }


    }
    return pre;
}
void print(List head)
{
    List pr;
    pr=head;
    while(pr->next!=NULL)
    {
        cout<<pr->next->entryad<<" "<<pr->next->data<<" "<<pr->next->outad<<endl;
        pr=pr->next;
    }
}
int main()
{
    map<string,pair<int,string> >m1;
    string ss;
    int n,k;
    cin>>ss;
    scanf("%d%d",&n,&k);
    int num=n;
    string s,e;
    int x,n1=n;
    while(n1--)
    {
        cin>>s>>x>>e;
        if(n==1)
        {
            cout<<s<<" "<<x<<" "<<e<<endl;
            return 0;
        }
        m1[s] = make_pair(x,e);
    }
    List head,t;
    //head=(List)malloc(sizeof(struct LNode));
    head= new LNode();
    head->next=NULL;
    string des=ss;
    t=head;
    int cn=0;
    while(cn<=num)
    {
        List q = new LNode();
        //q=(List)malloc(sizeof(struct LNode));
        q->entryad=des;//youwenti
        q->data=m1[des].first;
        q->outad=m1[des].second;
        q->next=NULL;
        des=m1[des].second;
        t->next=q;
        t=q;
        cn+=1;
        if(des=="-1")
            break;
    }
   // cout<<"cn: "<<cn<<endl;
    if(cn==k)
    {
        List p;
        p=reverseL(head,k);
        print(head);
    }
    else
    {
        int nk;
        nk=cn/k;
        if(nk==0)
        {
            List p;
            p=reverseL(head,k);
            print(head);
        }
        else if(nk!=0)//正好整除
        {
            List p;
            p=head;
            while(nk--)
            {
                    p=reverseL(p,k);
            }
            print(head);
        }
    }
    return 0;
}

3.分析

  1. 如何存数据:为了更快的找到地址,采用map存储。因为地址是唯一的,所以采用自己的地址作为key,数值和出地址作为value.使用pair存储。
  2. 迭代建立链表:初始化初始地址,然后一次用map,像数组下标一样访问地址,存储其(起始地址,值,出地址)。但是由于会存在多余的节点,没有一个节点的出地址是他的起始地址,那么这样的节点就不会被接入到链表。所以创建链表的时候,不可以采用while(n--),应该设置一个计数器,while(cn<=n),cn++这样的操作。已知-1是结束地址,那么当出地址为-1时,则表示当前链表已经到达了结尾,需要跳出循环。否则,map找不到值,会返回0,并不会抛出异常。记得更新n,即节点个数。
  3. 反转 链表:我们使用原链表进行操作。head为头节点,pre为head后的一个节点,pcur为代反转节点。
pre->next=pcur->next;
         
pcur->next=phead->next;
           
phead->next=pcur;
          
pcur=pre->next;

4.读清题意:every k,每k个反转,而不是前k个。注意边界测试,k=1,N=K,N整除K...

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值