91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

LeetCode如何k個一組翻轉鏈表

發布時間:2021-12-15 11:00:34 來源:億速云 閱讀:139 作者:小新 欄目:大數據

這篇文章給大家分享的是有關LeetCode如何k個一組翻轉鏈表的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

 

題目描述:

給你一個鏈表,每 k 個節點一組進行翻轉,請你返回翻轉后的鏈表。

k 是一個正整數,它的值小于或等于鏈表的長度。

如果節點總數不是 k 的整數倍,那么請將最后剩余的節點保持原有順序。

 

示例:

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

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

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

說明:

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

 

思路分析:

步驟分解:

  • 鏈表分區為已翻轉部分+待翻轉部分+未翻轉部分
  • 每次翻轉前,要確定翻轉鏈表的范圍,這個必須通過 k 此循環來確定
  • 需記錄翻轉鏈表前驅和后繼,方便翻轉完成后把已翻轉部分和未翻轉部分連接起來
  • 初始需要兩個變量 pre 和 end,pre 代表待翻轉鏈表的前驅,end 代表待翻轉鏈表的末尾
  • 經過k此循環,end 到達末尾,記錄待翻轉鏈表的后繼 next = end.next
  • 翻轉鏈表,然后將三部分鏈表連接起來,然后重置 pre 和 end 指針,然后進入下一次循環
  • 特殊情況,當翻轉部分長度不足 k 時,在定位 end 完成后,end==null,已經到達末尾,說明題目已完成,直接返回即可

時間復雜度為 O(n*K), 最好的情況為 O(n), 最差的情況未 O(n^2)O
空間復雜度為 O(1),除了幾個必須的節點指針外,我們并沒有占用其他空間。

LeetCode如何k個一組翻轉鏈表  
 

Python實現

# 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):
        dummy = ListNode(0)
        p = dummy
        while True:
            count = k 
            stack = []
            tmp = head
            while count and tmp:
                stack.append(tmp)
                tmp = tmp.next
                count -= 1
            # 注意,目前tmp所在k+1位置
            # 說明剩下的鏈表不夠k個,跳出循環
            if count : 
                p.next = head
                break
            # 翻轉操作
            while stack:
                p.next = stack.pop()
                p = p.next
            #與剩下鏈表連接起來 
            p.next = tmp
            head = tmp
        
        return dummy.next


   

java實現:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode reverseKGroup(ListNode head, int k) {
        if (head == null || head.next == null){
            return head;
        }
        //定義一個假的節點。
        ListNode dummy=new ListNode(0);
        //假節點的next指向head。
        // dummy->1->2->3->4->5
        dummy.next=head;
        //初始化pre和end都指向dummy。pre指每次要翻轉的鏈表的頭結點的上一個節點。end指每次要翻轉的鏈表的尾節點
        ListNode pre=dummy;
        ListNode end=dummy;

        while(end.next!=null){
            //循環k次,找到需要翻轉的鏈表的結尾,這里每次循環要判斷end是否等于空,因為如果為空,end.next會報空指針異常。
            //dummy->1->2->3->4->5 若k為2,循環2次,end指向2
            for(int i=0;i<k&&end != null;i++){
                end=end.next;
            }
            //如果end==null,即需要翻轉的鏈表的節點數小于k,不執行翻轉。
            if(end==null){
                break;
            }
            //先記錄下end.next,方便后面鏈接鏈表
            ListNode next=end.next;
            //然后斷開鏈表
            end.next=null;
            //記錄下要翻轉鏈表的頭節點
            ListNode start=pre.next;
            //翻轉鏈表,pre.next指向翻轉后的鏈表。1->2 變成2->1。dummy->2->1
            pre.next=reverse(start);
            //翻轉后頭節點變到最后。通過.next把斷開的鏈表重新鏈接。
            start.next=next;
            //將pre換成下次要翻轉的鏈表的頭結點的上一個節點。即start
            pre=start;
            //翻轉結束,將end置為下次要翻轉的鏈表的頭結點的上一個節點。即start
            end=start;
        }
        return dummy.next;


    }
    //鏈表翻轉
    // 例子:   head:1->2->3->4
    public ListNode reverse(ListNode head) {
         //單鏈表為空或只有一個節點,直接返回原單鏈表
        if (head == null || head.next == null){
            return head;
        }
        //前一個節點指針
        ListNode preNode = null;
        //當前節點指針
        ListNode curNode = head;
        //下一個節點指針
        ListNode nextNode = null;
        while (curNode != null){
            nextNode = curNode.next;//nextNode 指向下一個節點,保存當前節點后面的鏈表。
            curNode.next=preNode;//將當前節點next域指向前一個節點   null<-1<-2<-3<-4
            preNode = curNode;//preNode 指針向后移動。preNode指向當前節點。
            curNode = nextNode;//curNode指針向后移動。下一個節點變成當前節點
        }
        return preNode;

    }


}

感謝各位的閱讀!關于“LeetCode如何k個一組翻轉鏈表”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

海安县| 北碚区| 冀州市| 纳雍县| 林口县| 云浮市| 万年县| 保定市| 北碚区| 晋城| 永登县| 平果县| 伊春市| 揭阳市| 房山区| 珠海市| 安康市| 莲花县| 商南县| 葫芦岛市| 彭山县| 蒲城县| 曲阳县| 凤城市| 太和县| 汉川市| 滨海县| 馆陶县| 板桥市| 吴旗县| 滨州市| 佛教| 红河县| 西乡县| 霍邱县| 栾城县| 白玉县| 宁德市| 靖边县| 肇东市| 湄潭县|