@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. MAC上安装GCC失败

    问题 在用brew安装GCC时, 报了如下错误. ➜ ~ brew install gcc ==> Installing dependencies for gcc: isl, mpfr and ...

  2. Spark MemoryManager内存模型

  3. shell重温---基础篇(文件包含)

        和其他语言一样,Shell 也可以包含外部脚本.这样可以很方便的封装一些公用的代码作为一个独立的文件.Shell 文件包含的语法格式如下: . filename # 注意点号(.)和文件名中间 ...

  4. mybatis第二天——动态SQL与关联查询

    大纲摘要: 1.输入映射和输出映射 a) 输入参数映射 b) 返回值映射 2.动态sql a) If b) Where c) Foreach d) Sql片段 3.关联查询 a) 一对一关联 b) 一 ...

  5. 第五周 加分题-mybash的实现

    第五周 加分题-mybash的实现 使用fork,exec,wait实现mybash 产品代码 #include <stdio.h> #include <stdlib.h> # ...

  6. 2015539平措卓玛课堂测试(ch06)

    课堂测试(ch06) 1.下面代码中,对数组x填充后,采用直接映射高速缓存,所有对x和y引用的命中率为(D) A .1 B .1/4 C .1/2 D .3/4 解析:缓存命中:当程序需要第(k+1) ...

  7. jQuery学习- 表单事件

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  8. 7-[CSS]-css介绍,引入方式

    1.CSS介绍:层叠样式表(Cascading Style Sheets) 我们为什么需要CSS? 使用css的目的就是让网页具有美观一致的页面,另外一个最重要的原因是内容与格式分离 在没有CSS之前 ...

  9. CSS中的height与line-height的区别

    <p class='text'>高与行高的区别</p> 那么我要想让这些字上下居中那么可以用宽度和行高控制 .text{ height:25px; line-height:25 ...

  10. 异步任务(Celery)详解

    一.背景 在开发中,我们可能经常会遇到一些需要执行时间很长的任务,如果放在前端,会让用户一直卡在那儿等待或者一直转圈圈,体验非常不好.为了改善这种体验,我赶紧上网搜索,果然,前人早已有解决办法了.那就 ...