【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个结点为一组进行翻转的更多相关文章

  1. 单链表每k个节点为一组进行反转(最后不满k个时不反转)

    public class LinkReverse2 { public static Node mhead=null; public static Node mtail=null; public sta ...

  2. 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 算法思想:基本操作就是链表 ...

  3. 剑指offer四:链表中倒数第k个结点

    输入一个链表,输出该链表中倒数第K个结点 public class ListNode { int val; ListNode next = null; ListNode(int val) { this ...

  4. 剑指Offer 链表中倒数第k个结点

    题目描述 输入一个链表,输出该链表中倒数第k个结点.     思路: 法1:设置2个指针p,q.p先移动k次,然后pq同时后移,p到链表尾尾的时候,q指向倒数第k个节点. 注意://需要考虑k=0,以 ...

  5. 【编程题目】输入一个单向链表,输出该链表中倒数第 k 个结点

    第 13 题(链表):题目:输入一个单向链表,输出该链表中倒数第 k 个结点.链表的倒数第 0 个结点为链表的尾指针.链表结点定义如下: struct ListNode {int m_nKey;Lis ...

  6. 输出单向链表中倒数第k个结点

    描述 输入一个单向链表,输出该链表中倒数第k个结点,链表的倒数第0个结点为链表的尾指针. 链表结点定义如下: struct ListNode { int       m_nKey; ListNode* ...

  7. 找出链表中倒数第 k 个结点

    /* 题目:输入一个单向链表,输出该链表中倒数第 k 个结点.链表的倒数第 0 个结点为链表 的尾指针. 链表结点定义如下: struct node { int data; struct node * ...

  8. 链表中倒数第k个结点

    题目: 输入一个链表,输出该链表中倒数第k个结点. 思路: 因为是单向链表,如果使用最普通的遍历来解决的话会多出很多不必要的遍历.有一个比较好的解法,设置两个指针两个指针之间差k-1个位置,也就是当后 ...

  9. IT公司100题-13-求链表中倒数第k个结点

    问题描述: 输入一个单向链表,输出该链表中倒数第k个结点.链表倒数第0个节点为NULL. struct list_node { int data; list_node* next; }; 分析: 方法 ...

随机推荐

  1. linux分区与挂载

    分区是将一个硬盘驱动器分成若干个逻辑驱动器,分区是把硬盘连续的区块当做一个独立的磁盘使用.分区表是一个硬盘分区的索引,分区的信息都会写进分区表.通常情况下,为磁盘分区通常使用fdisk,它是对基于MB ...

  2. Js获取宽高度的归纳集锦总结

    首先,先吓唬一下我们的小白们!在js中的描述宽高的可以细分有22种.属性根据不同的兼容性也分为五种 window.innerWidth //除去菜单栏的窗口宽度,与浏览器相关 window.inner ...

  3. MakaJs:基于 React, Redux 的轻量级前端框架

    github: maka.js 留下您宝贵的STAR!谢谢 maka maka源于中文码咖,意为写代码的大咖 一眼即可看懂的前端框架,简约而不简单 1.安装 bash sudo npm i -g @m ...

  4. kali系统

    打开终端分别输入下面两条命令: update-alternatives --install /usr/bin/python python /usr/bin/python2 100 update-alt ...

  5. SQL SERVER数据库日常使用总结

    以下内容为平时工作自己个人总结,仅供参考,欢迎交流 SELECT A.CBM,A.CMC,SUM(B.MJE)MJE FROM YXHIS..TBZDZTHZ A,YXHIS..TBZDZTMX B ...

  6. django数据库迁移时候异常

    django数据库迁移时候异常 一.错误信息 Django在根据models生成数据库表时报 init() missing 1 required positional argument: 'on_de ...

  7. Python爬取猫眼电影100榜并保存到excel表格

    首先我们前期要导入的第三方类库有; 通过猫眼电影100榜的源码可以看到很有规律 如: 亦或者是: 根据规律我们可以得到非贪婪的正则表达式 """<div class ...

  8. XSS中的同源策略和跨域问题

    转自 https://www.cnblogs.com/chaoyuehedy/p/5556557.html 1 同源策略 所谓同源策略,指的是浏览器对不同源的脚本或者文本的访问方式进行的限制.比如源a ...

  9. docker3-镜像的使用

    基本使用命令: [root@ipha-dev71- docker]# docker search python # 搜索镜像 [root@ipha-dev71- docker]# docker pul ...

  10. Linux面试题-7

    在日常管理中,通常CPU会影响系统性能的情况是: A A:CPU已满负荷地运转 B:CPU的运行效率为30% C:CPU的运行效率为50% D:CPU的运行效率为80% 下面那个命令可以终止一个用户的 ...