@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个一组翻转链表的更多相关文章

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

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

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

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

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

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

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

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

  5. [LeetCode] 25. k个一组翻转链表

    题目链接: https://leetcode-cn.com/problems/reverse-nodes-in-k-group/ 题目描述: 给出一个链表,每 k 个节点一组进行翻转,并返回翻转后的链 ...

  6. LeetCode 25 —— K 个一组翻转链表

    1. 题目 2. 解答 首先,利用快慢指针确定链表的总结点数. 偶数个结点时,结点个数等于 i * 2. 奇数个结点时,结点个数等于 i * 2 + 1. 然后将链表的每 K 个结点划分为一组.循环对 ...

  7. [LeetCode] 25. K 个一组翻转链表 ☆☆☆☆☆(链表)

    https://leetcode-cn.com/problems/reverse-nodes-in-k-group/solution/javadi-gui-fang-fa-100-by-chadriy ...

  8. LeetCode 25. k个一组翻转链表(Reverse Nodes in k-Group)

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

  9. 25. K 个一组翻转链表

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

随机推荐

  1. Linux下onvif客户端关于ipc摄像头的搜索

    设备搜索:要访问一个IPC摄像头,或者说要调用IPC摄像头提供的WEB服务接口,就要先知道其IP地址,这就是设备发现的过程,或者叫设备搜索的过程.IPC摄像头用的是239.255.255.250(端口 ...

  2. 旧贴-在 win7 / win8 下安装苹果系统 (懒人版)

    前言 该文转载自远景论坛,发布时间2012年,仅供学习参考 这篇安装教程的素材在国庆就准备好了,但那时学习任务比较重,没有时间发帖,一直拖到现在.趁这个周末有空,赶紧写完它,希望能帮助一些景友. 论坛 ...

  3. 六、Delphi10.3通过Json.Serializers单元对大量数据序列化

    一.参考我之前的博客,Delphi可以很方便的把类和结构体转换成JSON数据,但是数据量大了,就会非常之慢,1万条数据需要20秒左右.如果引用Serializers单元,那么100万数据只需要4秒左右 ...

  4. x01.calc: 编程语言

    想写终极程序,大都去写操作系统或编程语言了.编程语言可以极其复杂如C,也可以极简,只处理加减乘除如 calc. 1. 词法分析 %{ #include <stdio.h> #include ...

  5. eclipse-Debug调试操作

    去除所有断点(打开debug视图):(或者直接点击菜单栏的run也有对应的菜单) 常用快捷键:  F5    Step into 单步调试进入函数内部.  F6 Step over 单步调试不进入函数 ...

  6. 信息安全铁人三项赛--资质赛writeup

    [博客目录] 工具 Burp Suite stegsolve.jar 十六进制编辑器 赛题 第一题 第二题 第三题 第四题 第五题 第六题 1- 工具: 1.1- Burp Suite 一款可以进行再 ...

  7. Linux部署python django程序-apache

    1.安装Apache 先卸载自带的httpd rpm -e httpd --nodeps 在网上下载四个文件 1.apr-1.4.6.tar.gz 2.apr-util-1.5.1.tar.gz 3. ...

  8. c# ajax从后台获取数据list数组 $.each再显示数据

    后台代码 public JsonResult linkage(string Department) {//逻辑是:先从数据库查到表数据 再把表数据转换为LIST给AJAX HE_Department ...

  9. JUC——并发集合类

    如果要进行多个数据的保存,无疑首选类集(List.Set.Queue.Map),在类集的学习的时候也知道一个概念:许多集合的子类都具有同步与异步的差别,但是如果真的要在多线程之中去使用这些类,是否真的 ...

  10. MySQL事务及其实现

    事务定义 事务是访问并更新数据库中各个数据项的一个程序执行单元.在事务操作中,要不都做修改,要么都不做. 事务特性 事务具有ACID四个特性,分别是:原子性(Atomicity).一致性(Consis ...