厚积薄发打卡Day108:链表(六)<重排链表>
重排链表
问题;给定一个链表,链表中节点的顺序是L0–>L1–>L2–>…->Ln,请问如何重排链表使节点的顺序变成 L0–>Ln–>L1–>Ln-1–>L2–>Ln-2… 例如,输入链表(a),重排之后得到链表(b):
输入:1->2->3->4->5->6
输出:1->6->2->5->3->4
思路
- 对半分
- 反转后半部分
- 拼接
实现
/**
* 重排链表
*/
public class ReorderNodeList {
public static void reorderList(ListNode head) {
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode fast = dummy;
ListNode slow = dummy;
while (fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next;
if (fast.next != null) {
fast = fast.next;
}
}
ListNode temp = slow.next;
slow.next = null;
link(head, ReverseNodeList.reverseNodeList(temp), dummy);
}
private static void link(ListNode node1, ListNode node2, ListNode head) {
ListNode prev = head;
while (node1 != null && node2 != null) {
ListNode temp = node1.next;
prev.next = node1;
node1.next = node2;
prev = node2;
node1 = temp;
node2 = node2.next;
}
if (node1 != null) {
prev.next = node1;
}
}
public static void main(String[] args) {
ListNode node1 = new ListNode(1);
ListNode node2 = new ListNode(2);
ListNode node3 = new ListNode(3);
ListNode node4 = new ListNode(4);
ListNode node5 = new ListNode(5);
ListNode node6 = new ListNode(6);
node1.next = node2;
node2.next = node3;
node3.next = node4;
node4.next = node5;
node5.next = node6;
System.out.print("original==>");
ListNode.printNodeList(node1);
reorderList(node1);
System.out.print("reorder==>");
ListNode.printNodeList(node1);
}
}
original==>1->2->3->4->5->6->NULL
reorder==>1->6->2->5->3->4->NULL