Q25 - Hard - k個一組翻轉鏈表

給出一個鏈表,每 k 個節(jié)點一組進行翻轉,并返回翻轉后的鏈表。

k 是一個正整數,它的值小于或等于鏈表的長度。如果節(jié)點總數不是 k 的整數倍,那么將最后剩余節(jié)點保持原有順序。

示例 :

給定這個鏈表:1->2->3->4->5

當 k = 2 時,應當返回: 2->1->4->3->5

當 k = 3 時,應當返回: 3->2->1->4->5

說明 :

你的算法只能使用常數的額外空間。
你不能只是單純的改變節(jié)點內部的值,而是需要實際的進行節(jié)點交換。


# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def reverse(self, head, k):
        p = head
        for i in range(k):  # 先檢驗夠不夠數
            p = p.next
            if p is None:
                return None
        p = head.next.next
        last = head.next
        for i in range(k - 1):  # 翻轉
            last.next = p.next
            p.next = head.next
            head.next = p
            p = last.next
        return last
        
    def reverseKGroup(self, head, k):
        """
        :type head: ListNode
        :type k: int
        :rtype: ListNode
        """
        if k < 2:
            return head
        dummy = ListNode(0)
        dummy.next = head
        p = dummy
        while p is not None:
            p = self.reverse(p, k)
        return last.next

翻轉

翻轉的思想是,把p一個挨一個的拎到head后面

比如1 2 3 4 5,k = 3 加上dummy為 0 1 2 3 4 5

第1趟循環(huán): 0 1 2 3 4 5

head --> 0, last --> 1,p --> 2
把2拎到0的后面,變成0 2 1 3 4 5

第2趟循環(huán):0 2 1 3 4 5

head --> 0, last --> 1,p --> 3
把3拎到0的后面,變成0 3 2 1 4 5

第3趟循環(huán):0 3 2 1 4 5

head --> 0, last --> 1,p --> 4
把4拎到0的后面,變成0 4 3 2 1 5

循環(huán)了k-1次即3次,循環(huán)退出

最后得 4 3 2 1 5

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 收到貨物后包裝完整,未拆箱,售后安裝師傅上門安裝時,拆箱發(fā)現外機的外殼有損傷,聯(lián)系蘇寧要求退貨,蘇寧拒絕我的無償退...
    蔡蔡Tacy閱讀 295評論 0 0

友情鏈接更多精彩內容