原题地址:https://oj.leetcode.com/problems/reverse-nodes-in-k-group/
题意:
Given a linked list, reverse the nodes of a linked list k at a time and return its modified list.
If the number of nodes is not a multiple of k then left-out nodes in the end should remain as it is.
You may not alter the values in the nodes, only nodes itself may be changed.
Only constant memory is allowed.
For example,
Given this linked list: 1->2->3->4->5
For k = 2, you should return: 2->1->4->3->5
For k = 3, you should return: 3->2->1->4->5
解题思路:稍微难一点的链表反转题目。需要将链表反转的函数单独写成一个函数,这样看起来会清晰一些。
其实这题很简单,知道了翻转链表的通用写法之后,解这一题其实就是循环翻转的过程(知道最后一个group长度不足)。
先介绍下翻转链表的写法:
1. 首先设置一个前置节点,将前置节点的next
设置为头节点,以头节点为当前节点,开始循环
2. 将当前节点的next赋给一个临时节点,然后将当前节点的next
指向前置节点,随后依次位移前置节点指针和当前节点指针:前置节点指针指向当前节点,当前节点指针指向临时节点,这样就完成了一次循环
3. 当前置节点指针指向尾节点时,循环结束
有个这个翻转函数之后,只要对链表进行循环,当计数长度不k
时,指针继续前进;当计数长度到达k时,将头尾节点作为参数传入翻转函数进行翻转,然后重新拼接到原链表中。直至到达链表末尾。
简单插图如下:
Python代码实现:
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
# @param head, a ListNode
# @param k, an integer
# @return a ListNode
def reverseKGroup(self, head, k):
#迭代版,时间复杂度O(n),空间复杂度O(1)
# Need help
if head == None: return head
dummy = ListNode(0)
dummy.next = head
start = dummy # start =0. Given this linked list: 1->2->3->4->5 # For k = 2, you should return: 2->1->4->3->5
while start.next:
end = start # end = 0
for i in range(k-1):
end = end.next # end = 1
if end.next == None: return dummy.next
(start.next, start)=self.reverse(start.next, end.next) # (start.next=3, start=1)=self.reverse(start.next=1, end.next=2)
return dummy.next
def reverse(self, start, end):
dummy = ListNode(0)
dummy.next = start
while dummy.next != end:
tmp = start.next
start.next = tmp.next
tmp.next = dummy.next
dummy.next = tmp
#start.next, start.next.next, dummy.next = start.next.next, dummy.next, start.next
# The above line is wrong! But WHY?
return (end, start)
"""
Let k = 2, List be:
--> 1 --> 2 --> 3 --> 4 --> 5
Initial State:
start start.next
| |
V V
--> 1 --> 2 --> 3 --> 4 --> 5
After dealing with first group (i.e., first k nodes)
start start.next
| |
V V
--> 2 --> 1 --> 3 --> 4 --> 5
"""
转载自:点击打开链接