Leetcode题库——25.k个一组翻转链表
@author: ZZQ
@software: PyCharm
@file: ReverseList.py
@time: 2018/11/6 15:13
题目要求:给出一个链表,每 k 个节点一组进行翻转,并返回翻转后的链表。
k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么将最后剩余节点保持原有顺序。
示例 :
给定这个链表:1->2->3->4->5
当 k = 2 时,应当返回: 2->1->4->3->5
当 k = 3 时,应当返回: 3->2->1->4->5
说明 :
你的算法只能使用常数的额外空间。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
思路:针对每个子链表进行反转,需要在每次做翻转时记录当前子链表的首节点,尾节点以及下一个待翻转链表的首节点。
需要注意当剩余节点数小于k的情况以及链表本身为空的情况。
class ListNode(object):
def __init__(self, x):
self.val = x
self.next = None
class Solution():
def __init__(self):
pass
def reverseKGroup(self, head, k):
"""
:type head: ListNode
:type k: int
:rtype: ListNode
"""
if k == 0 or k == 1 or head is None or head.next is None:
return head
NextListHeadNode = head
NewH = ListNode(0)
tempNewH = ListNode(0)
time = 0
while head.next is not None and tempNewH is not None:
if time == 0:
count, PreListFirstNode, PreListLastNode, NextListHeadNode = self.ReverseKList(head, k)
time += 1
NewH = PreListFirstNode
PreListLastNode.next = NextListHeadNode
tempNewH = NewH
if count < k:
for i in range(count):
tempNewH = tempNewH.next
else:
for i in range(count - 1):
tempNewH = tempNewH.next
else:
head = NextListHeadNode
count, PreListFirstNode, PreListLastNode, NextListHeadNode = self.ReverseKList(head, k)
PreListLastNode.next = NextListHeadNode
tempNewH.next = PreListFirstNode
time += 1
tempNewH = tempNewH
if count < k:
for i in range(count+1):
tempNewH = tempNewH.next
else:
for i in range(count):
tempNewH = tempNewH.next
return NewH
def ReverseKList(self, head, k):
PreH = ListNode(0)
PostH = head.next
count = 0
while head is not None and count < k:
head.next = PreH
PreH = head
head = PostH
if PostH is not None:
PostH = PostH.next
count += 1
if head is None and count < k: # 如果剩余的节点个数小于k,则返回原来的节点顺序
lastFirstNode = self.ReverselastList(PreH)
lastEndnode = lastFirstNode
for i in range(count-1):
lastEndnode = lastEndnode.next
lastEndnode.next = None
return count, lastFirstNode, lastEndnode, None
else:
tempPreH = PreH
tt = count
while tt-1 > 0:
tempPreH = tempPreH.next
tt -= 1
return count, PreH, tempPreH, head
# 返回当前子链表经过翻转后的首节点,尾节点以及下一个子链表未反转前的首节点
def ReverselastList(self, head):
PreH = ListNode(0)
PostH = head.next
while head is not None:
head.next = PreH
PreH = head
head = PostH
if PostH is not None:
PostH = PostH.next
return PreH.next
Leetcode题库——25.k个一组翻转链表的更多相关文章
- Java实现 LeetCode 25 K个一组翻转链表
25. K 个一组翻转链表 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表. k 是一个正整数,它的值小于或等于链表的长度. 如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持 ...
- leetcode 24. 两两交换链表中的节点 及 25. K 个一组翻转链表
24. 两两交换链表中的节点 问题描述 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表. 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换. 示例: 给定 1->2-> ...
- leetcode 25. K 个一组翻转链表
# coding:utf-8 __author__ = "sn" """ 25. K 个一组翻转链表 给你一个链表,每 k 个节点一组进行翻转,请你返 ...
- LeetCode 25. K 个一组翻转链表 | Python
25. K 个一组翻转链表 题目来源:https://leetcode-cn.com/problems/reverse-nodes-in-k-group 题目 给你一个链表,每 k 个节点一组进行翻转 ...
- [LeetCode] 25. k个一组翻转链表
题目链接: https://leetcode-cn.com/problems/reverse-nodes-in-k-group/ 题目描述: 给出一个链表,每 k 个节点一组进行翻转,并返回翻转后的链 ...
- LeetCode 25 —— K 个一组翻转链表
1. 题目 2. 解答 首先,利用快慢指针确定链表的总结点数. 偶数个结点时,结点个数等于 i * 2. 奇数个结点时,结点个数等于 i * 2 + 1. 然后将链表的每 K 个结点划分为一组.循环对 ...
- [LeetCode] 25. K 个一组翻转链表 ☆☆☆☆☆(链表)
https://leetcode-cn.com/problems/reverse-nodes-in-k-group/solution/javadi-gui-fang-fa-100-by-chadriy ...
- LeetCode 25. k个一组翻转链表(Reverse Nodes in k-Group)
题目描述 给出一个链表,每 k 个节点一组进行翻转,并返回翻转后的链表. k 是一个正整数,它的值小于或等于链表的长度.如果节点总数不是 k 的整数倍,那么将最后剩余节点保持原有顺序. 示例 : 给定 ...
- 25. K 个一组翻转链表
给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表.k 是一个正整数,它的值小于或等于链表的长度.如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序.示例 :给定这个链表: ...
随机推荐
- #leetcode刷题之路38-报数
报数序列是一个整数序列,按照其中的整数的顺序进行报数,得到下一个数.其前五项如下:1. 12. 113. 214. 12115. 1112211 被读作 "one 1" (&quo ...
- Linux-2.6驱动程序分层分离概念
下面以一个按键的实验作为驱动分离时间简单学习: #include <linux/module.h> #include <linux/version.h> #include &l ...
- Android 读取Assets下的资源文件
做Android开发近半年了,东西越学越多,硬盘容量越来越小.很多东西找起来也不方便,为此,我打算从今天起把工作中学到的东西整理起来,写成日记.也希望与广大网友分享我的经验.一同进步.今天主要介绍文件 ...
- flex拖动图片
<?xml version="1.0" encoding="utf-8"?><s:Application xmlns:fx="htt ...
- 10 腾讯云、django2.0、uwsgi、mysql、nginx 部署
1.腾讯云 操作系统 Ubuntu Server 16.04.1 LTS 64位 获取root权限 ubuntu@VM---ubuntu:~$ sudo passwd root Enter new U ...
- 27-ATM+购物车程序
1.需求 本章作业: 模拟实现一个ATM + 购物商城程序 额度 15000或自定义 实现购物商城,买东西加入 购物车,调用信用卡接口结账 可以提现,手续费5% 支持多账户登录 支持账户间转账 记录每 ...
- Kubernetes学习之路(十七)之statefulset控制器
目录 一.statefulset简介 二.为什么要有headless?? 三.为什么要 有volumeClainTemplate?? 四.statefulSet使用演示 (1)查看statefulse ...
- nginx反向代理解决wechat图片问题
在nginx 中nginx.conf开启反向代理 location ^~ /wechat_image/ { add_header 'Access-Control-Allow-Origin' " ...
- 【轮子狂魔】手把手教你自造Redis Client
为什么做Redis Client? Redis Client顾名思义,redis的客户端,主要是封装了一些对于Redis的操作. 而目前用的比较广泛的 ServiceStack.Redis 不学好,居 ...
- cadence allegro16.6 pcb文件转pads pcb文件方法教程
在pcb设计工作中,有时会被要求将pcb文件转成其他软件的格式,pcb Allegro装Pads的方法如下. 在转换的过程中我们需要用到三种软件,ad.pads.allegro.转换的流程是:alle ...