PTA(链表)2-7 h0321. 反转链表
PTA(链表)2-7 h0321. 反转链表
zhangzhang2-7 h0321. 反转链表
分数 3
作者 黄正鹏
单位 贵州工程应用技术学院
给定一个常数 K 和一个单链表 L,请你在单链表上每 K 个元素做一次反转,并输出反转完成后的链表。
如果链表最后一部分不足 K 个元素,则最后一部分不翻转。
例如,假设 L 为 1→2→3→4→5→6,如果 K=3,则你应该输出 3→2→1→6→5→4;如果 K=4,则你应该输出 4→3→2→1→5→6 。
补充:
本题中可能包含不在链表中的节点,这些节点无需考虑。
输入格式:
第一行包含头节点地址,总节点数量 N 以及常数 K。1≤N≤10^5 ,1≤K≤N
节点地址用一个 5 位非负整数表示(可能有前导 0),NULL 用 −1 表示。
接下来 N 行,每行描述一个节点的信息,格式如下:
1 | Address Data Next |
其中 Address 是节点地址,Data 是一个整数,Next 是下一个节点的地址。
输出格式:
将重新排好序的链表,从头节点点开始,依次输出每个节点的信息,格式与输入相同。
输入样例:
1 | 00100 6 4 |
输出样例:
1 | 00000 4 33218 |
逻辑
逆天这题太抽象了,还是弄懂了,以后不看之前写的,再自己写一遍
详细逻辑见PTA(链表)1-10 单链表分段逆转 | zhangzhang-blog,这题非要把地址定下来了,跟PTA(顺序表)2-5 链表去重 | zhangzhang-blog的地址逻辑是一样的
一定要把整体框架知道,再在大点里面细分各个小步骤
记忆
- 记以下五个要点:
- 先定义Pretail,判断是否满足K个,不满足就退出,再定义NewTail,Current,NextHead,这是找此次反转的头部和尾部,再就是反转该链表,用的是三指针法:curr,prev,next
1.PreTail
- 初始是定义
PreTail: 总是指向当前要逆转段的前一个结点(即上一段的尾结点或头结点 L)
2.检查段长
- 在开始逆转一段之前,先从
PreTail->Next开始向后检查 K 个结点是否存在。如果不存在 K 个结点,则这段不进行逆转,直接退出循环。
3.NewTail Current NextHead定位段的头部和尾部(把整体的找到先):
NewTail: 逆转后新段的尾结点,即逆转前老段的头结点PreTail->Next。Current: 用于遍历 $K$ 个结点,并辅助逆转操作。NextHead: 逆转后新段的头结点(即逆转前老段的第 $K$ 个结点)。
4.prev curr next K 个结点的原地逆转:
- 三指针法
5.连接新的段:
prev 现在指向逆转后的新段的头结点 (即原段的第 K 个结点)
将上一段的尾结点连接到逆转后的新段的头结点:
PreTail(上一段的尾结点)的Next应该指向逆转后的新段的头结点NextHead(prev)。更新
PreTail指向新逆转段的尾结点,即NewTail,以便开始下一段的逆转。
答案
1 |
|


