题意:

每k个元素反转链表,不足k个就不反转。如原链表为1→2→3→4→5→6,k=3,则反转后的链表为3→2→1→6→5→4;若k=4,则反转后的链表为4→3→2→1→5→6。

思路:

这题会比较烦,写代码前一定要现在纸上理清思路,写出关键代码,不然出了错再改来改去真的很浪费时间,要是考试的话估计心态就蹦了。本题是比较经典的“反转链表(指反转整条链表)”的升级版,但做法是一样的。我们可以把“反转”这一动作单独抽象成一个函数,然后遍历链表,每遍历k个结点(假设是pi...pj),就把pi...pj这个子链表进行反转,易错点在于每k个子链表之间该如何衔接而确保不会断链,具体看代码,我已经注释的很详细了。

注:本题是关于“链表”操作非常经典的题目,应当熟练掌握,因为这是非常非常基础的问题。另外,个人觉得有必要说一下的是,网上很多的解题报告,以及《算法笔记》里的题解,都不是真正的“反转”操作,虽然也能AC,但不利于真正掌握链表、指针的操作,有些投机取巧。要是面试写白板代码的时候写成那种样子,是要被鄙视的。

代码:

#include <cstdio>

;
struct Node{
    int data;
    int curr,next;
}LinkList[N];

//反转操作,记录新链表的头结点和尾结点
//传入时,tail==head,记得加“&”
void reverseLinkList(int& head,int& tail)
{
    //如果链表为空,或者只有一个结点,则直接返回
     || LinkList[head].next==-) return;
    ,p=head;//p为工作指针
    tail=LinkList[head].curr;
    ){
        int next=LinkList[p].next;
        )
            head=p;//如果next为空,则当前结点为最后一个结点,令其为新链表的头结点
        LinkList[p].next=pre;
        pre=p;
        p=next;
    }
}

int main()
{
    //freopen("pat.txt","r",stdin);
    int n,k,head;
    scanf("%d%d%d",&head,&n,&k);
    int curr,data,next;
    ;i<n;i++){
        scanf("%d%d%d",&curr,&data,&next);
        LinkList[curr].data=data;
        LinkList[curr].curr=curr;
        LinkList[curr].next=next;
    }
    int p=head;
    ,tail=-;
    ){
        ;
         && cnt<k){
            p=LinkList[p].next;
            cnt++;
        }
        ){
            int tmp=p;
            p=LinkList[p].next;//先更新,再截断
            LinkList[tmp].next=-;//把子链表截断
            //翻转当前含有k个结点的子链表,并分别记录其头结点和尾结点
            int tmptail=tmphead;
            reverseLinkList(tmphead,tmptail);
            ) newhead=tmphead;
            else LinkList[tail].next=tmphead;
            tail=tmptail;//更新尾结点
        }else{
            LinkList[tail].next=tmphead;//剩余不足k个结点,就把剩余部分直接链在tail后面
            p=-;//别忘了
        }
    }
    p=newhead;
    ){
        printf("%05d %d ",LinkList[p].curr,LinkList[p].data);
        ) printf("%05d\n",LinkList[p].next);
        else printf("-1\n");
        p=LinkList[p].next;
    }
    ;
}

【第一次限时AC的时候是这么做的,但这不是纯正“翻转”操作】

#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
;
struct Node{
    int data;
    int curr,next;
}LinkList1[N],LinkList2[N];

int main()
{
    //freopen("pat.txt","r",stdin);
    int n,k,head;
    scanf("%d%d%d",&head,&n,&k);
    int curr,data,next;
    ;i<n;i++){
        scanf("%d%d%d",&curr,&data,&next);
        LinkList1[curr].data=data;
        LinkList1[curr].curr=curr;
        LinkList1[curr].next=next;
    }
    ;
    ,pre=-;
    vector<Node> temp;
    ){
        temp.push_back(LinkList1[p]);
        cnt++;
        if(cnt==k){
            reverse(temp.begin(),temp.end());
            ){
                newhead=temp[].curr;
                pre=newhead;
            }else{
                LinkList2[pre].next=temp[].curr;
                pre=temp[].curr;
            }
            ;
            <temp.size();i++){
                LinkList2[pre].data=temp[i].data;
                LinkList2[pre].curr=temp[i].curr;
                LinkList2[pre].next=temp[i+].curr;
                pre=temp[i+].curr;
            }
            LinkList2[pre].data=temp[i].data;
            LinkList2[pre].curr=temp[i].curr;
            LinkList2[pre].next=-;
            //注意别忘了重置
            cnt=;
            temp.clear();
        }
        p=LinkList1[p].next;
    }
    ){
        LinkList2[pre].next=temp[].curr;
        pre=temp[].curr;
        ;
        <temp.size();i++){
            LinkList2[pre].data=temp[i].data;
            LinkList2[pre].curr=temp[i].curr;
            LinkList2[pre].next=temp[i+].curr;
            pre=temp[i+].curr;
        }
        LinkList2[pre].data=temp[i].data;
        LinkList2[pre].curr=temp[i].curr;
        LinkList2[pre].next=-;
    }
    p=newhead;
    ){
        printf("%05d %d ",LinkList2[p].curr,LinkList2[p].data);
        ) printf("%05d\n",LinkList2[p].next);
        else printf("-1\n");
        p=LinkList2[p].next;
    }
    ;
}

1074 Reversing Linked List的更多相关文章

  1. PAT 1074 Reversing Linked List[链表][一般]

    1074 Reversing Linked List (25)(25 分) Given a constant K and a singly linked list L, you are suppose ...

  2. PAT 甲级 1074 Reversing Linked List (25 分)(链表部分逆置,结合使用双端队列和栈,其实使用vector更简单呐)

    1074 Reversing Linked List (25 分)   Given a constant K and a singly linked list L, you are supposed ...

  3. PAT 1074. Reversing Linked List (25)

    Given a constant K and a singly linked list L, you are supposed to reverse the links of every K elem ...

  4. PAT Advanced 1074 Reversing Linked List (25) [链表]

    题目 Given a constant K and a singly linked list L, you are supposed to reverse the links of every K e ...

  5. 1074. Reversing Linked List (25)

    模拟题,注意当k == 1 与 k == n时情况 #include <stdio.h> #include <string.h> #include <iostream&g ...

  6. PAT (Advanced Level) 1074. Reversing Linked List (25)

    简单题. #include<cstdio> #include<cstring> #include<cmath> #include<vector> #in ...

  7. PAT甲题题解-1074. Reversing Linked List (25)-求反向链表

    题意说的很清楚了,这种题的话,做的时候最好就是在纸上自己亲手模拟一下,清楚一下各个指针的情况, 这样写的时候就很清楚各个指针变量保存的是什么值. PS:一次AC哈哈,所以说自己动手在纸上画画还是很有好 ...

  8. PAT 1074. Reversing Linked List

    #include <cstdio> #include <cstdlib> #include <iostream> #include <unordered_ma ...

  9. 【PAT甲级】1074 Reversing Linked List (25 分)

    题意: 输入链表头结点的地址(五位的字符串)和两个正整数N和K(N<=100000,K<=N),接着输入N行数据,每行包括结点的地址,结点的数据和下一个结点的地址.输出每K个结点局部反转的 ...

随机推荐

  1. AtCoder ARC097C Sorted and Sorted:dp

    传送门 题意 有 $ 2n $ 个球排成一行,其中恰好有 $ n $ 个白球和 $ n $ 个黑球.每个球上写着数字,其中白球上的数字的并集为 $ \lbrace 1 \dots n\rbrace $ ...

  2. SQL命令查询Oracle存储过程信息(代码内容等)

    SELECT * FROM ALL_SOURCE  where TYPE='PROCEDURE'  AND TEXT LIKE '%0997500%'; --查询ALL_SOURCE中,(脚本代码)内 ...

  3. ffmpeg的centos、msys2、msvc编译

    msys2 和 centos https://ffmpeg.org/download.html https://ffmpeg.zeranoe.com/builds/ Windows MSYS2准备 1 ...

  4. 【Python】循环设计

    转载:作者:Vamei 出处:http://www.cnblogs.com/vamei range() 在Python中,for循环后的in跟随一个序列的话,循环每次使用的序列元素,而不是序列的下标. ...

  5. scorm标准的LMS在客户端的运行机制

    1)运行SCORM APIAdapter.   2)调用API初始化函数.   3)加载课件SCO初始化数据.   4)获取Data Model中的用户ID和用户姓名.   5)获取Data Mode ...

  6. 常用algorithm及其Python实现

    冒泡排序 def bubble_sort(li): for i in range(len(li)-1): # i表示第几趟 for j in range(len(li)-i-1): # j表示图中的箭 ...

  7. Leetcode 1019. Next Greater Node In Linked List

    单调栈的应用. class Solution: def nextLargerNodes(self, head: ListNode) -> List[int]: stack = [] ret = ...

  8. cursor光标类型

    今天早上在网上看到一篇关于光标类型的总结代码,很好,特定拿来: 最终结果: 代码: <!DOCTYPE html> <html lang="zh-cn"> ...

  9. 本站上线KMS服务~一句命令激活windows和office

    服务器地址:kms.luody.info 更新: 脚本维护更新:2016-09-29 服务端版本:vlmcsd-1108-2017-01-19-Hotbird64 服务作用:在线激活windows和o ...

  10. [python] 排序的动态展示

    两句闲话 本文所说的排序是指基于交换的排序.因此,按理来说,本文应该叫基于交换的排序的动态展示,但是这样太拗口了. 效果展示 最终效果如下. 实现方法 需要说明的是,在这里是通过pygame来实现图形 ...