国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

[Leetcode] Swap Nodes in Pairs Reverse Nodes in k-

TZLLOG / 3027人閱讀

摘要:三指針法復雜度時間空間思路基本的操作鏈表,見注釋。注意使用頭節點方便操作頭節點。翻轉后,開頭節點就成了最后一個節點。

Swap Nodes in Pairs

Given a linked list, swap every two adjacent nodes and return its head.

For example, Given 1->2->3->4, you should return the list as 2->1->4->3.

Your algorithm should use only constant space. You may not modify the values in the list, only nodes itself can be changed.

三指針法 復雜度

時間 O(N) 空間 O(1)

思路

基本的操作鏈表,見line注釋。注意使用dummy頭節點方便操作頭節點。

代碼
public class Solution {
    public ListNode swapPairs(ListNode head) {
        ListNode dummy = new ListNode(0);
        dummy.next = head;
        // curr是待交換的兩個節點前面那個節點
        ListNode curr = dummy;
        while(curr != null && curr.next != null && curr.next.next != null){
            ListNode third = curr.next.next.next;
            ListNode second = curr.next.next;
            ListNode first = curr.next;
            // 把第二個節點的next置為第一個節點
            second.next = first;
            // 把當前節點的next置為第二個節點
            curr.next = second;
            // 把第一個節點的next置為第三個節點
            first.next = third;
            // 將當前節點置為第一個節點,繼續下一輪交換(此時first實際已經是第二個節點了)
            curr = first;
        }
        return dummy.next;
    }
}

不想用那么多指針?

public class Solution {
    public ListNode swapPairs(ListNode head) {
        ListNode dummy = new ListNode(0);
        dummy.next = head;
        ListNode curr = dummy;
        while(curr != null && curr.next != null && curr.next.next != null){
            ListNode tmp = curr.next.next.next; // tmp - 3
            curr.next.next.next = curr.next;    // 3 - 1
            curr.next = curr.next.next;         // 1 - 2
            curr.next.next.next = tmp;          // 3 - tmp
            curr = curr.next.next;              // 0 - 2
        }
        return dummy.next;
    }
}
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

分段反轉 復雜度

時間 O(N) 空間 O(1)

思路

其實就是每K個節點執行一次反轉鏈表,不過這里有幾點要注意:

如果剩余節點不足K個則不執行反轉,所以要先判斷是否可以反轉

為了拼接這個反轉過后的鏈表,我們需要類似Reverse Linked List II一樣的操作,即記錄下該段鏈表的開頭節點,這個開頭節點的前一個節點,該鏈表的最后一個節點,和這最后一個節點的下一個節點。翻轉后,開頭節點就成了最后一個節點。

拆分成子函數,清晰易懂

K等于1的時候直接返回原鏈表

代碼
public class Solution {
    public ListNode reverseKGroup(ListNode head, int k) {
        if(k == 1) return head;
        ListNode dummy = new ListNode(0);
        dummy.next = head;
        ListNode curr = dummy;
        while(curr != null && curr.next != null && curr.next.next != null){
            // 檢測是否有足夠節點供反轉,不足直接退出
            if(!hasEnoughNodes(curr.next, k)) break;
            // 記錄下第一個節點,反轉后成為最后一個節點
            ListNode last = curr.next;
            // 從這第一個節點開始反轉K個節點
            ListNode[] nodes = reverseK(last, k);
            // 將第0個節點的next接上新鏈表的頭節點
            curr.next = nodes[0];
            // 將新鏈表的尾節點的后一個節點置為后一段鏈表的頭節點
            last.next = nodes[1];
            // 準備反轉下一段鏈表
            curr = last;
        }
        return dummy.next;
    }
    
    private boolean hasEnoughNodes(ListNode runner, int k){
        int remains = 0;
        while(runner != null && remains < k){
            remains++;
            runner = runner.next;
        }
        if(remains < k) return false;
        return true;
    }
    
    private ListNode[] reverseK(ListNode p1, int k){
        ListNode p2 = p1.next;
        // 反轉K個節點
        while(p2 != null && k > 1){
            ListNode tmp = p2.next;
            p2.next = p1;
            p1 = p2;
            p2 = tmp;
            k--;
        }
        // 返回值第一個是新的鏈表頭節點,第二個是下一段鏈表的頭節點
        ListNode[] res = {p1, p2};
        return res;
    } 
}

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/64686.html

相關文章

  • 【LC總結】翻轉鏈表 Swap in Pairs, Reverse in k-Group, Reve

    摘要:注意這里,只要走到第位 Swap Nodes in Pairs For example,Given 1->2->3->4, you should return the list as 2->1->4->3. Solution public class Solution { public ListNode swapPairs(ListNode head) { if...

    Steve_Wang_ 評論0 收藏0
  • leetcode24 Swap Nodes in Pairs 交換鏈表中相鄰兩個節點

    摘要:題目要求翻譯過來就是將鏈表中相鄰兩個節點交換順序,并返回最終的頭節點。思路這題的核心解題思路在于如何不占用額外的存儲空間,就改變節點之間的關系。 題目要求 Given a linked list, swap every two adjacent nodes and return its head. For example, Given 1->2->3->4, you should r...

    GT 評論0 收藏0
  • leetcode 24 Swap Nodes in Pairs

    摘要:最后返回頭節點。同時題目要求只能占用常數空間,并且不能改變節點的值,改變的是節點本身的位置。翻轉是以兩個節點為單位的,我們新聲明一個節點表示當前操作到的位置。每次操作結束,將指針后移兩個節點即可。執行操作前要確定操作的兩個節點不為空。 題目詳情 Given a linked list, swap every two adjacent nodes and return its head....

    heartFollower 評論0 收藏0
  • leetcode 部分解答索引(持續更新~)

    摘要:前言從開始寫相關的博客到現在也蠻多篇了。而且當時也沒有按順序寫現在翻起來覺得蠻亂的。可能大家看著也非常不方便。所以在這里做個索引嘻嘻。順序整理更新更新更新更新更新更新更新更新更新更新更新更新更新更新更新更新 前言 從開始寫leetcode相關的博客到現在也蠻多篇了。而且當時也沒有按順序寫~現在翻起來覺得蠻亂的。可能大家看著也非常不方便。所以在這里做個索引嘻嘻。 順序整理 1~50 1...

    leo108 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<