问题描述:
Given a singly linked list L: L0→L1→…→Ln-1→Ln,
reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→…
You must do this in-place without altering the nodes’ values.
For example,
Given{1,2,3,4}, reorder it to{1,4,2,3}.
解题思路:
1.先将链表从中间结点分成两部分
2.将后半部分的链表倒序
3.按顺序将后半部分逐个加入到前半部分链表
public void reorderList(ListNode head) {
if (head == null || head.next == null || head.next.next == null) {
return;
}
ListNode middleNode = getMiddleNode(head);
ListNode rightLNode = reverseLNode(middleNode.next);
middleNode.next = null;
merge(head, rightLNode);
}
// 个人感觉以下这些方法都属于工具类,比较常用到的操作
public static ListNode getMiddleNode(ListNode head) {
ListNode slow = head;
ListNode fast = head.next;
while (fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
}
return slow;
}
public static ListNode reverseLNode(ListNode head) {
ListNode pre = null;
ListNode next = null;
while (head != null) {
next = head.next;
head.next = pre;
pre = head;
head = next;
}
return pre;
}
public static ListNode merge(ListNode list1, ListNode list2) {
int index = 0;
ListNode dummy = new ListNode(0);
while(list1 != null && list2 != null){
if(index %2 == 0){
dummy.next = list1;
list1 = list1.next;
}
else{
dummy.next = list2;
list2 = list2.next;
}
dummy = dummy.next;
index++;
}
if(list1 != null){
dummy.next = list1;
}
if(list2 != null){
dummy.next = list2;
}
return dummy.next;
}