如何把链表以k个结点为一组进行翻转
【MT笔试题】
题目描述:
K 链表翻转是指把每K个相邻的结点看成一组进行翻转,如果剩余结点不足 K 个,则保持不变。假设给定链表 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 和一个数K,如果K的值为2,那么翻转后的链表是:2 -> 1 -> 4 -> 3 -> 6 -> 5 -> 7,如果K是3,那么翻转后的链表为:3 -> 2 -> 1 -> 6 -> 5 -> 4 -> 7.
解法: 先把链表按照K长度切割,把每段都翻转,除了最后一段,然后再链接起来。
class k_reverse:
def __init__(self):
pass
def __call__(self, link, k):
return self.handle(link, k)
@staticmethod
def patition(link: SingleLink, k): # 切分
cur = link.head
head = cur
lst = []
i = 0
maybe_tail = None
while cur:
i += 1
if i != k: # 个数不够
maybe_tail = cur
cur = cur.next
continue
tmp = cur.next # 个数够了
cur.next = None
tail = cur
cur = tmp
temp = SingleLink()
temp.head = head
temp.tail = tail
lst.append(temp)
head = tmp
i = 0
temp = SingleLink()
if head:
temp.head = head
if maybe_tail:
temp.tail = maybe_tail
if temp.head:
lst.append(temp) # 最后一段不足k的头
return lst
@staticmethod
def reverse(link: SingleLink): # 翻转
left = link.head
if left is None and left.next is None:
return
# 至少两个结点
right = left.next
while right:
tmp = right.next
right.next = left
if left is link.head:
left.next = None
link.tail = left
left = right
right = tmp
link.head = left
def handle(self, link, k):
part_lst = self.patition(link, k)
for i in part_lst:
if i == part_lst[-1]:
break
self.reverse(i)
length = len(part_lst)
if length: # 不为空
i = 0
while i < length-1:
part_lst[i].tail.next = part_lst[i+1].head
i += 1
ln = SingleLink()
ln.head = part_lst[0].head
ln.tail = part_lst[-1].tail
return ln
测试:
instance = k_reverse()
print("反转前: ", end="")
p = ln.head
while p:
print(p.data, end=" ")
p = p.next
ln = instance(ln, 3)
print()
print("反转后: ", end="")
p = ln.head
while p:
print(p.data, end=" ")
p = p.next
print()
print("尾巴结点:", ln.tail.data)
反转前: 1 2 3 4 5 6 7 8
反转后: 3 2 1 6 5 4 7 8
尾巴结点: 8
如何把链表以k个结点为一组进行翻转的更多相关文章
- 单链表每k个节点为一组进行反转(最后不满k个时不反转)
public class LinkReverse2 { public static Node mhead=null; public static Node mtail=null; public sta ...
- Reverse Nodes In K Group,将链表每k个元素为一组进行反转---特例Swap Nodes in Pairs,成对儿反转
问题描述:1->2->3->4,假设k=2进行反转,得到2->1->4->3:k=3进行反转,得到3->2->1->4 算法思想:基本操作就是链表 ...
- 剑指offer四:链表中倒数第k个结点
输入一个链表,输出该链表中倒数第K个结点 public class ListNode { int val; ListNode next = null; ListNode(int val) { this ...
- 剑指Offer 链表中倒数第k个结点
题目描述 输入一个链表,输出该链表中倒数第k个结点. 思路: 法1:设置2个指针p,q.p先移动k次,然后pq同时后移,p到链表尾尾的时候,q指向倒数第k个节点. 注意://需要考虑k=0,以 ...
- 【编程题目】输入一个单向链表,输出该链表中倒数第 k 个结点
第 13 题(链表):题目:输入一个单向链表,输出该链表中倒数第 k 个结点.链表的倒数第 0 个结点为链表的尾指针.链表结点定义如下: struct ListNode {int m_nKey;Lis ...
- 输出单向链表中倒数第k个结点
描述 输入一个单向链表,输出该链表中倒数第k个结点,链表的倒数第0个结点为链表的尾指针. 链表结点定义如下: struct ListNode { int m_nKey; ListNode* ...
- 找出链表中倒数第 k 个结点
/* 题目:输入一个单向链表,输出该链表中倒数第 k 个结点.链表的倒数第 0 个结点为链表 的尾指针. 链表结点定义如下: struct node { int data; struct node * ...
- 链表中倒数第k个结点
题目: 输入一个链表,输出该链表中倒数第k个结点. 思路: 因为是单向链表,如果使用最普通的遍历来解决的话会多出很多不必要的遍历.有一个比较好的解法,设置两个指针两个指针之间差k-1个位置,也就是当后 ...
- IT公司100题-13-求链表中倒数第k个结点
问题描述: 输入一个单向链表,输出该链表中倒数第k个结点.链表倒数第0个节点为NULL. struct list_node { int data; list_node* next; }; 分析: 方法 ...
随机推荐
- 原生js动态添加新元素、删除元素方法
1. 添加新元素 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> < ...
- MAC 上的Phantomjs的安装和配置
1.下载 http://phantomjs.org/download.html 选择mac版本下载 2.下载完成后,解压缩,然后放到自己的一个目录下面 例如:/usr/local/Phantomjs/ ...
- Vue成员获取
0828自我总结 Vue成员获取 一.vue中data的获取 1.获取data里面的某个变量 $data.msg也可以简写成msg 2.获取data全部内容 $data 二.获取vue中vue挂钩的对 ...
- 异常:微信小程序tabBar不生效
app.json全局tabBar设置tabBar不显示 由于小程序的机制问题,首页的tabBar第一个导航必须是首页 "pages": [ "pages/index/in ...
- 重大升级!SEER见证人,您的节点需要在10月28日前更新
SEER的区块链底层目前还处于不断完善中.一些新的完善更新会为区块链的基础设施--节点软件添加新的功能.理事会将会就是否接受新的节点版本进行共识投票,如果提案投票通过,将要求所有见证人在指定时间前将节 ...
- 构造函数语义学——Copy Constructor 篇
构造函数语义学--Copy Constructor 篇 本文主要介绍<深度探索 C++对象模型>之<构造函数语义学>中的 Copy Constructor 构造函数的调用时机 ...
- 在Ubuntu16.0.4安装hipcaffe
1. 安装 AMD ROCm 显卡条件 要安装AMD的 ROCm显卡,必须满足以下条件,只能高于下面信息版本,不能低于. Distribution Kernel GCC GLIBC x86_64 Fe ...
- 【Spring Cloud】全家桶介绍(一)
一.微服务架构 1.微服务架构简介 1.1.分布式:不同的功能模块部署在不同的服务器上,减轻网站高并发带来的压力. 1.2.集群:多台服务器上部署相同应用构成一个集群,通过负载均衡共同向外提供服务. ...
- chrome devtools tip(2)--自定义代码片段,构建你的工具箱
平常开发中,有些代码片段常常用到的,比如,获取 url 参数,rgb转16进制,打印下当前页面的性能数据,给所有的 span 加个样式, 防抖节流,fetch接口,类似 jquery这样的顺手 选择 ...
- vue-cli2、vue-cli3脚手架详细讲解
前言: vue脚手架指的是vue-cli它是vue官方提供的一个快速构建单页面(SPA)环境配置的工具,cli 就是(command-line-interface ) 命令行界面 .vue-cli是 ...