[leetcode]25. Reverse Nodes in k-Group
阿新 • • 發佈:2018-12-01
這題是真的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; }