问题描述:

给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。

k 是一个正整数,它的值小于或等于链表的长度。

如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

示例 :

给定这个链表:1->2->3->4->5

当 k = 2 时,应当返回: 2->1->4->3->5

当 k = 3 时,应当返回: 3->2->1->4->5

说明 :

你的算法只能使用常数的额外空间。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

方法一:利用栈(不过空间复杂度为O(k))

过程:

一次循环之后:

第二次循环过后:

第三次循环:由于tmp==None,此时count=,因此直接将p.next指向head。最后返回newhead.next即可。

代码:

class ListNode:
def __init__(self,x):
self.val=x
self.next=None
n1=ListNode(1)
n2=ListNode(2)
n3=ListNode(3)
n4=ListNode(4)
n5=ListNode(5)
n6=ListNode(6)
n7=ListNode(7)
n1.next=n2;n2.next=n3;n3.next=n4;n4.next=n5 def printListNode(head):
while head != None:
print(head.val)
head=head.next
#printListNode(n1) class Solution:
def reverseKGroup(self, head,k):
newhead = ListNode(0)
p = newhead
while True:
count = k
stack = []
tmp = head
while count and tmp:
stack.append(tmp)
tmp = tmp.next
count -= 1
if count :
p.next = head
break
while stack:
p.next = stack.pop()
p = p.next
head = tmp return newhead.next s=Solution()
t=s.reverseKGroup(n1,2)
printListNode(t)

方法二:尾插法

初始化:

进入第一次循环:

进入第二次循环:

依次类推。

再比如:[1,2,3,4,5,6,7],k=3,过程也就是:

[2,3,1,4,5,6,7]

[3,2,1,4,5,6,7]

[3,2,1,5,6,4,7]

[3,2,1,6,5,4,7]

# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None class Solution:
def reverseKGroup(self, head: ListNode, k: int) -> ListNode:
newhead= ListNode(0)
newhead.next = head
pre = newhead
tail = newhead
while True:
count = k
while count and tail:
count -= 1
tail = tail.next
if not tail: break
head = pre.next
while pre.next != tail:
cur = pre.next # 获取下一个元素
# pre与cur.next连接起来,此时cur(孤单)掉了出来
pre.next = cur.next
cur.next = tail.next # 和剩余的链表连接起来
tail.next = cur #插在tail后面
# 改变 pre tail 的值
pre = head
tail = head
return newhead.next

方法三:递归,理解不了

class Solution:
def reverseKGroup(self, head,k):
cur = head
count = 0
while cur and count!= k:
cur = cur.next
count += 1
if count == k:
cur = self.reverseKGroup(cur, k)
print("cur.val=",cur.val)
while count:
print("head.val=",head.val)
tmp = head.next
head.next = cur
cur = head
head = tmp
count -= 1
head = cur
return head

代码来源:

作者:powcai
链接:https://leetcode-cn.com/problems/reverse-nodes-in-k-group/solution/kge-yi-zu-fan-zhuan-lian-biao-by-powcai/
来源:力扣(LeetCode)

为了加深理解,图为自己所作。

【python-leetcode25-翻转链表】K 个一组翻转链表的更多相关文章

  1. LeetCode 25. K 个一组翻转链表 | Python

    25. K 个一组翻转链表 题目来源:https://leetcode-cn.com/problems/reverse-nodes-in-k-group 题目 给你一个链表,每 k 个节点一组进行翻转 ...

  2. [LintCode] Reverse Nodes in k-Group 每k个一组翻转链表

    Given a linked list, reverse the nodes of a linked list k at a time and return its modified list. If ...

  3. k个一组翻转链表(java实现)

    题目: 给出一个链表,每 k 个节点一组进行翻转,并返回翻转后的链表. k 是一个正整数,它的值小于或等于链表的长度.如果节点总数不是 k 的整数倍,那么将最后剩余节点保持原有顺序. 示例 : 给定这 ...

  4. [LeetCode]25. Reverse Nodes in k-Group k个一组翻转链表

    Given a linked list, reverse the nodes of a linked list k at a time and return its modified list. k ...

  5. leetcode 25. K 个一组翻转链表

    # coding:utf-8 __author__ = "sn" """ 25. K 个一组翻转链表 给你一个链表,每 k 个节点一组进行翻转,请你返 ...

  6. Java实现 LeetCode 25 K个一组翻转链表

    25. K 个一组翻转链表 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表. k 是一个正整数,它的值小于或等于链表的长度. 如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持 ...

  7. LeetCoded第25题题解--K个一组翻转链表--java--链表

    链表 单链表:链表中的每个元素实际上是一个单独的对象,而所有对象都通过每个元素的引用字段链接在一起. 双链表:与单链表不同的是,双链表的每个节点都含有两个引用字段. 链表优点 灵活分配内存空间 能在O ...

  8. js 之k个一组翻转链表

    题目描述 将给出的链表中的节点每\ k k 个一组翻转,返回翻转后的链表如果链表中的节点数不是\ k k 的倍数,将最后剩下的节点保持原样你不能更改节点中的值,只能更改节点本身.要求空间复杂度 \ O ...

  9. leetcode 24. 两两交换链表中的节点 及 25. K 个一组翻转链表

    24. 两两交换链表中的节点 问题描述 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表. 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换. 示例: 给定 1->2-> ...

  10. 如何k个一组反转链表

    之前的文章「递归反转链表的一部分」讲了如何递归地反转一部分链表,有读者就问如何迭代地反转链表,这篇文章解决的问题也需要反转链表的函数,我们不妨就用迭代方式来解决. 本文要解决「K 个一组反转链表」,不 ...

随机推荐

  1. yii2 password hash生成与验证方法

    1.生成 $password是明文.如:123456 $this->password_hash = Yii::$app->security->generatePasswordHash ...

  2. Innovus 对multibit 的支持

    如果在综合阶段没有做multibit merge, 或综合阶段由于缺失物理信息multibit cell merge 不合理,那就需要PR 工具做multibit merge 或split. Inno ...

  3. Jmeter-ServerAgent

    You can specify the listening ports as arguments (0 disables listening), default is 4444:   $ ./star ...

  4. python的爬虫小入门

    爬虫的相关操作 1.爬文本内容 # coding=gbk import requests ##声明相关库 import re response=requests.get('http://duanziw ...

  5. 分布式一致性协议 --- Paxos

    问题 Paxos 到底解决什么样的问题,动机是什么 Paxos 流程是怎么样的? Paxos 算法的缺陷是什么 概述 Paxos 是分布式一致性算法,根据少数服从多数的原则多个节点确定某个数值.通过学 ...

  6. PHP 站内消息的表结构设计

    1)添加全站通知:信息存入到 tb_message 2)用户点开信息或者设置信息为已阅读:插入记录到 tb_message_readlog 如何设计存储的表?求最佳方案 CREATE TABLE `m ...

  7. 5 asyncio 梨视频

    # 如何提升requests模块爬取数据的效率?- 多进程或多线程(不建议) 太耗费资源- 线程池或进程池(适当使用) - 单线程 + 异步协程(推荐) # 线程池使用案例 # 梨视频 下载作业 im ...

  8. TakeColor下载及调节鼠标指针不一致的问题

    取色器下载链接: 链接:https://pan.baidu.com/s/19TBWZA2ltaLQjzskTipnmg 提取码:2uz3 若出现指针与鼠标不一致: TakeColor v8.0 > ...

  9. JS-this的使用

    做前端开发已经半年之多了,前几天看见apply时心生疑惑,于是查阅了好多资料但还是不太理解,只知道是源于this的问题,今天偶然看到了阮一峰大佬的讲解js中的this问题(http://www.rua ...

  10. (二)tensorflow-gpu2.0之自动导数

    import tensorflow as tf ''' 梯度:导数或偏导数 1.在什么点的导数:在点(a,b,c,w)=(1,2,3,4)点的导数 2.梯度环境 对谁求导: 对w求导 函数: y = ...