Problem:
Given a singly linked list L: L0→L1→…→Ln-1→Ln,
reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→…You may not modify the values in the list's nodes, only nodes itself may be changed.
Example 1:
Given 1->2->3->4, reorder it to 1->4->2->3.Example 2:
Given 1->2->3->4->5, reorder it to 1->5->2->4->3.
Analysis:
本题的题意是按照指定的顺序重新生成一个新的链表。解决本题的思路是首先生成其逆转的链表,然后在同时遍历两个链表,依次插入两个链表的元素。代码如下:
Code:
/**
* 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;
// get reverse linked list
ListNode reverseList = new ListNode(-1);
ListNode p = head;
int cnt = 0;
while(p != null) {
ListNode temp = new ListNode(p.val);
ListNode nxt = reverseList.next;
reverseList.next = temp;
temp.next = nxt;
cnt++;
p = p.next;
}
p = head;
ListNode q = reverseList.next;
boolean flag = false;
int ans = cnt/2;
while(ans > 0) {
if(flag) {
p = p.next;
flag = false;
} else {
ans--;
ListNode temp = new ListNode(q.val);
ListNode nxt = p.next;
p.next = temp;
temp.next = nxt;
p = p.next;
q = q.next;
flag = true;
}
}
if(cnt%2 == 1) {
p = p.next;
}
p.next = null;
}
}