LeetCode—143. Reorder List
题目
https://leetcode.com/problems/reorder-list/description/
将链表的后半部分反转,在间隔插入到前半部分的链表中。
思路及分析
直接说方法步骤:
1.找到链表的中点的前驱节点pre
2.将中点开始的后半部分链表反转,方法是参考LeetCode—92. Reverse Linked List II
3.每次取反转好的后半部分一个节点插入到前半部分链表中
思路很清晰,注意写好细节就行了,特别是结束的判别条件,这里调bug的时候总结了一个小经验:如果可以明确知道循环几次就可以结束,那就尽量不要用判断指针是不是空作为结束条件了。就是要用把握最大的吧
代码
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public void reorderList(ListNode head) {
if(head == null || head.next == null) return;
ListNode ranger = head;
int len = 0;
while(ranger != null){
ranger = ranger.next;
len++;
}
ListNode pre = head;
ListNode left = head;
ListNode right = head;
for(int i=0; i<len/2-1; i++){
pre = pre.next;
}
left = pre.next;
right = left.next;
while(right != null){
left.next = right.next;
right.next = pre.next;
pre.next = right;
right = left.next;
}
left = head;
right = pre.next;
if(int i=0; i<len/2; i++){
// while(right.next != null){
pre.next = pre.next.next;
right.next = left.next;
left.next = right;
left = left.next.next;
right = pre.next;
}
return;
}
}