标签:需要 nbsp 改变 插入 head lis == 顺序 pre
给定一个单链表 L:L0→L1→…→Ln-1→Ln ,
将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→…
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例 1:
给定链表 1->2->3->4, 重新排列为 1->4->2->3.
示例 2:
给定链表 1->2->3->4->5, 重新排列为 1->5->2->4->3.
class Solution {
public void reorderList(ListNode head) {
//先找到链表中点,分成左右两部分
//将右部分逆序,再对两部分进行顺序合并
if(head==null || head.next == null)
return;
ListNode mid = findMid(head);
ListNode l2 = mid.next;
mid.next = null;
l2 = reverse(l2);
mergeList(head, l2);
}
//链表合并
public void mergeList(ListNode l1,ListNode l2)
{
//将l2的节点插入l1的两两节点之中
ListNode l1_next = null;
ListNode l2_next = null;
while(l2 != null)
{
l1_next = l1.next;
l2_next = l2.next;
l1.next = l2;
l2.next = l1_next;
l1 = l1_next;
l2 = l2_next;
}
}
//链表逆序
public ListNode reverse(ListNode node)
{
ListNode next = null;
ListNode pre = null;
while(node!=null)
{
next = node.next;
node.next = pre;
pre = node;
node = next;
}
return pre;
}
//找链表终点
public ListNode findMid(ListNode node)
{
ListNode fast = node;
ListNode slow = node;
do
{
fast = fast.next.next;
slow = slow.next;
}while(fast != null && fast.next != null);
return slow;
}
}
标签:需要 nbsp 改变 插入 head lis == 顺序 pre
原文地址:https://www.cnblogs.com/pionice/p/14656259.html