zoukankan      html  css  js  c++  java
  • 1074 Reversing Linked List (25分)

    题目:1074 Reversing Linked List (25分)

    题意

    给N个链表结点,以及K,对每K个长度的链表做逆置,输出逆置后的链表。

    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

    解法

    构造链表,一趟遍历,顺序存入数组,每k个进行翻转。
    ps:vector数组,reverse翻转(手动模拟翻转有两个点过不了,真菜啊!!!,欢迎指出错误)

    code

    /***************************
            Hello World!
    ***************************/
    #include <bits/stdc++.h>
    
    using namespace std;
    typedef long long ll;
    
    int n;
    int head;
    int k;
    
    struct node{
        int key;
        int ne;//5位地址
    }List[100005],temp;
    
    vector<node>a;
    
    int main()
    {
        scanf("%d%d%d",&head,&n,&k);
        for(int i=1;i<=n;i++) {
            int add,key,ne;
            scanf("%d%d%d",&add,&key,&ne);
    
            List[add].key=key;
            List[add].ne=ne;
        }
    
        int p=head,j=-1;
        while(p!=-1)
        {
            ++j;
            temp.key=List[p].key;
            temp.ne=p;
            a.push_back(temp);
            p=List[p].ne;
        }
        //有的结点不在
    
        //为什么用reverse就可以,自己模拟有bug??
        int m=a.size()/k;//可以翻转m次
        for(int i=0;i<m;++i)
        {
            reverse(a.begin()+i*k,a.begin()+i*k+k);
        }
        for(int i=0;i<a.size();i++)
        {
            if(i!=(a.size()-1)) printf("%05d %d %05d
    ",a[i].ne,a[i].key,a[i+1].ne);
            else printf("%05d %d -1
    ",a[i].ne,a[i].key);
        }
    
        //为什么手动模拟过不了呢,哪有逻辑错误。。。
    //    int i=0;
    //    while(i<=j)
    //    {
    //        if(i+k-1<=j) {
    //            for(int x=i+k-1;x>=i;--x)
    //            {
    //                printf("%05d %d ",a[x].ne,a[x].key);
    //                if(x==i) {
    //                    if(i+k<=j) printf("%05d
    ",a[i+k].ne);
    //                    else printf("-1
    ");
    //                }
    //                else {
    //                    printf("%05d
    ",a[x-1].ne);
    //                }
    //            }
    //        }
    //        else {
    //            for(int x=i;x<=j;++x)
    //            {
    //                printf("%05d %d ",a[x].ne,a[x].key);
    //                if(x==j) {
    //                    printf("-1
    ");
    //                }
    //                else {
    //                    printf("%05d
    ",a[x+1].ne);
    //                }
    //            }
    //        }
    //        i+=k;
    //    }
        return 0;
    }
    /***************************
            The end!
    ***************************/
    

    总结

    还是STL好

  • 相关阅读:
    二维数组中的查找
    排序算法——冒泡、选择、插入
    排序算法——快速、归并
    最小的K个数
    重建二叉树
    反转链表
    LeetCode 278 第一个错误的版本
    LeetCode 929 独特的电子邮件地址
    LeetCode 38 报数
    模型参数初始化
  • 原文地址:https://www.cnblogs.com/liuyongliu/p/13417120.html
Copyright © 2011-2022 走看看