给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
k 是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
示例 :
给定这个链表:1->2->3->4->5
当 k = 2 时,应当返回: 2->1->4->3->5
当 k = 3 时,应当返回: 3->2->1->4->5
说明 :
你的算法只能使用常数的额外空间。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
没什么可以说的直接暴力就好了,不过这里用到了栈
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def reverseKGroup(self, head, k):
"""
:type head: ListNode
:type k: int
:rtype: ListNode
"""
dummy = point = ListNode(0)
while True:
temp = head
count = k
stack = []
while count and temp:
stack.append(temp)
temp = temp.next
count -= 1
if count:
point.next = head
break
while stack:
point.next = stack.pop()
point = point.next
point.next = temp
head = temp
return dummy.next
每次放进去k个到stack[]里面,然后取出来,取都选最上面的,所以这样存取的时候就正好达到了题目要求的效果。
按照道理来说这样来说,应该就可以没事啦,可以我看到一位大神的递归法当时就研究起来了,真的是只可意会不可言传,估计要积攒很多解题的经验才能有这样的思路吧,好在紧忙看了半天搞懂了其中的思路,而且时间比上面的用栈的要快
一些值得注意的地方我也注释了,解题嘛,用不同的方法去解决挺有成就感的,就像题目以各种方式去让你失败一样,自己用多种方式去通过题目的测试很好玩。
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def reverseKGroup(self, head, k):
cur = head # head是k个节点的第一个
count = 0
while cur and count < k:
cur = cur.next
count += 1
if count == k:
cur = self.reverseKGroup(cur, k) # 循环到最后不足K的节点(即次节点之后就是剩余节点)
while count:
temp = head.next # 临时存放head.next
# 交换首尾
head.next = cur
cur = head
head = temp #下一个
count -= 1
head = cur
return head
原文:https://www.cnblogs.com/fanwenkeer/p/11279960.html