赞
踩
给你一个链表,每 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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。