Leetcode 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


分析:


1. 首先要判斷以當前節點之後的鏈表的節點個數是否大於等於k,如果滿足,進行第2步,否則,直接返回。這裏寫一個輔助函數isValid(ListNode head, int k)來進行判斷比較方便。

2. 判斷過後如果需要進行反轉,則當前節點和之後的k-1個節點進行反轉。由於表頭會發生改變,因此使用dummy node比較方便。


舉一個例子說明上面的算法:   1 --> 2 --> 3 --> 4      k = 2

1. 首先判斷isValid(head, 2),有效,所以開始對1,2這一對節點進行反轉。

dummy node   -->   1   -->   2   -->   3   -->   4    -->    null

     pre               start                   end

2. 在反轉的過程中,需要幾個指針,pre = dummy,這個指針需要記錄一組反轉節點之前的節點,從而使一組反轉的節點整體轉過來,start指針和pre節點的目的類似,只不過是使反轉組的第一個節點轉到最後一個,end指針則用來把反轉組的節點和後面的節點連接起來。


dummy node   -->   2   -->   1   -->   3   -->   4    -->    null

                                       pre       start                      end

3. 1和2反轉之後,三個指針都向後推,再對3和4進行反轉。


Java代碼實現:


/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
public class Solution {
    public ListNode reverseKGroup(ListNode head, int k) {
        if(head==null || head.next==null)
            return head;
            
        ListNode dummy = new ListNode(0);
        dummy.next = head;
        ListNode pre = dummy;
        ListNode node = head;
        while(isValid(node, k) && node!=null)
        {
            ListNode start = node;
            ListNode temp = node.next;
            ListNode end = temp;
            for(int i=1;i<k;i++)
            {
                end = temp.next;
                temp.next = node;
                node = temp;
                temp = end;
            }
            pre.next = node;
            start.next = end;
            pre = start;
            node = end;
        }
        
        return dummy.next;
    }
    private boolean isValid(ListNode head, int k)
    {
        ListNode node = head;
        for(int i=0;i<k;i++)
        {
            if(node==null)
                return false;
            node = node.next;
        }
        return true;
    }
}



發佈了59 篇原創文章 · 獲贊 1 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章