1. 程式人生 > >[leetcode]25. Reverse Nodes in k-Group

[leetcode]25. Reverse Nodes in k-Group

這題是真的hard。我卡了好久沒有想明白。

這個迭代解法太絕妙了:
https://leetcode.com/problems/reverse-nodes-in-k-group/discuss/11440/Non-recursive-Java-solution-and-idea

public ListNode reverseKGroup(ListNode head, int k) {
    ListNode begin;
   //head就是一個從頭遍歷到尾的指標
    if (head==null || head.next ==null || k==1)
    	return head;
    ListNode dummyhead = new ListNode(-1);
    dummyhead.next = head;
    begin = dummyhead;  //begin是自己加的頭結點
    int i=0;
    while (head != null){
    	i++;
    	if (i%k == 0){
    	      //這裡begin實際都是前一組翻轉後的最後一個
    		begin = reverse(begin, head.next);
    		head = begin.next;
    	} else {
    		head = head.next;
    	}
    }
    //dummyhead就是第一個begin,第一個begin指向了第一組翻轉後的首結點
    //所以dummyhead就是整個連結串列的頭結點了
    //返回dummyhead.next 就得到無空結點的連結串列
    return dummyhead.next;
    
}

public ListNode reverse(ListNode begin, ListNode end){
	ListNode curr = begin.next;
	ListNode next, first;
	ListNode prev = begin;
	//first此時是這一組翻轉前的第一個
	first = curr; 
	while (curr!=end){
		next = curr.next;
		curr.next = prev;
		prev = curr;
		curr = next;
	}
	//每一次讓這一組的頭結點指向翻轉後的首結點
	begin.next = prev;
	//first此時是這一組翻轉後的最後一個,讓first連上還未翻轉的下一組的第一個
	first.next = curr;
	//返回新的begin,也就是下一組的前一個
	return first;
}