给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
k 是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
示例 :
给定这个链表:1->2->3->4->5
当 k = 2 时,应当返回: 2->1->4->3->5
当 k = 3 时,应当返回: 3->2->1->4->5
说明 :
- 你的算法只能使用常数的额外空间。
- 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
思路:
递归,
先判断一下有没有k个node,如果没有就直接返回head,
如果有,那么就找到第k个node,把第k个node后面的链表用tail记录下来,第k个node的next置空,
从头到第k个node进行翻转,翻转完之后head指向链表尾,
把head连接上tail递归地结果即可。
# 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 = ListNode(1)
cnt = 0
p = head
kthnode = None
while(p):
cnt += 1
if cnt == k - 1:
kthnode = p.next #找到第k的节点了,p是第k - 1个节点
break
p = p.next
if not kthnode: #链表长度小于k,无需翻转
return head
tail = kthnode.next #tail及其后面是本次翻转不处理的部分
kthnode.next = None
dummy.next = self.reverseLL(head)#从头到第K个节点进行翻转
head.next = self.reverseKGroup(tail, k)#此时head指向翻转结果的最后一个node
return dummy.next
def reverseLL(self, head):
if not head or not head.next:
return head
p = self.reverseLL(head.next)
head.next.next = head
head.next = None
return p
# 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
"""
if not head or not head.next:
return head
l = 0
p = head
while p:
l += 1
if l == k:
break
p = p.next
if l < k:
return head
#head ~ p 都要逆转
tmp = self.reverseKGroup(p.next, k)
p.next = None
newhead = self.reversedLL(head)
head.next = tmp
return newhead
def reversedLL(self, head):
if not head or not head.next:
return head
p = self.reversedLL(head.next)
head.next.next = head
head.next = None
return p
第二个写于2019年09月30日23:12:37