如何把链表以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; }; 分析: 方法 ...
随机推荐
- python 基本排序算法
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2019/9/15 下午5:06 # @Author : lb # @File : so ...
- 安装VMworkstation和Centos虚拟机
1.安装VMware workstation. 2.下一步. 3.可以选择安装位置,下面选项不选. 4.这两个选项不需要选. 5.下一步 6.安装 7. 8.点击许可证输入密钥,密钥在网上搜,然后就完 ...
- [HDU5001]Walk
Problem Description I used to think I could be anything, but now I know that I couldn't do anything. ...
- Spring Security 整合JWT(四)
一.前言 本篇文章将讲述Spring Security 简单整合JWT 处理认证授权 基本环境 spring-boot 2.1.8 mybatis-plus 2.2.0 mysql 数据库 maven ...
- 关于a标签的href属性
今天有人问起我a标签的href属性值为 # 与 JavaScript:void(0) 有啥区别,想来也没啥可说,就简单说两句 a标签的href属性,优点有: 天然鼠标手型,以及可以被键盘focus以及 ...
- 2,手动创建CAD二次开发项目--AutoCAD二次开发(2020版)
本项目使用手动创建,意为不使用SDK模板. 从Visual Studio的“文件”下拉菜单中,选择“新建”->“项目...”. 在出现的“新建项目”对话框的“项目类型:”树中,单击“ Visua ...
- collectionView reloadData走了不执行cellForItemAtIndexPath
有可能是sizeForItemAtIndexPath方法中的前几个cell没有设置大小, 这里必须设置, 哪怕是设置一个很小的值
- < 配置jupyer notebook遇到的问题 - 500 : Internal Server Error >
< anaconda配置jupyer notebook遇到的问题 - 500 : Internal Server Error > 问题描述: 我的jupyer notebook是在anac ...
- 双系统开机引导菜单修复方法 进win7无须重启|metro引导|双系统菜单名字修改
此文转自互联网,一部分是原创. 主要内容 1.修复双系统菜单(win7与win8双系统),进入win7不再需要重启,普通菜单样式(普通引导,非metro界面),更加简洁,实用,开机即可选择操作系统 2 ...
- Java基础(二)数据类型
数据类型主要分为基本类型和引用类型两大类. 一.基本类型 1.基本类型又分为数值类型和boolean类型, (1)数值类型包括浮点数类型.整数类型和字符类型 整型 ...