LeetCode143 重排链表
给定一个单链表 L:L0→L1→…→Ln-1→Ln ,
将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→…
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
可以遍历然后存起来,然后空间换时间。
也可以递归,但是递归的方法需要巧妙一点。
这里借用windliang的解法,每次往内递归,把head指向tail,tail指向内部处理完的链表的第一个节点。
1 public void reorderList(ListNode head) { 2 3 if (head == null || head.next == null || head.next.next == null) { 4 return; 5 } 6 int len = 0; 7 ListNode h = head; 8 //求出节点数 9 while (h != null) { 10 len++; 11 h = h.next; 12 } 13 14 reorderListHelper(head, len); 15 } 16 17 private ListNode reorderListHelper(ListNode head, int len) { 18 if (len == 1) { 19 ListNode outTail = head.next; 20 head.next = null; 21 return outTail; 22 } 23 if (len == 2) { 24 ListNode outTail = head.next.next; 25 head.next.next = null; 26 return outTail; 27 } 28 //得到对应的尾节点,并且将头结点和尾节点之间的链表通过递归处理 29 ListNode tail = reorderListHelper(head.next, len - 2); 30 ListNode subHead = head.next;//中间链表的头结点 31 head.next = tail; 32 ListNode outTail = tail.next; //上一层 head 对应的 tail 33 tail.next = subHead; 34 return outTail; 35 } 36 37 作者:windliang 38 链接:https://leetcode-cn.com/problems/reorder-list/solution/xiang-xi-tong-su-de-si-lu-fen-xi-duo-jie-fa-by-34/ 39 来源:力扣(LeetCode) 40 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
第三种方法就是先拆分链表成两半,然后把后半部分翻转,然后两个链表合并。