题目描述
Given a singly linked list L: L 0→L 1→…→L n-1→L n,
reorder it to: L 0→L n →L 1→L n-1→L 2→L n-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}.
思路:
快慢指针找到中间结点,然后根据中间结点,将链表断开,翻转后面部分链表,然后将两个链表合并
/**
* Definition for singly-linked list.
* class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public void reorderList(ListNode head) {
if(head == null || head.next == null || head.next.next == null)
return;
ListNode slow = head;
ListNode fast = head;
//快慢指针找到中间结点
while(fast != null && fast.next != null && fast.next.next != null){
slow = slow.next;
fast = fast.next.next;
}
//断开链表,fast指向后半部分链表,head仍然是头结点,之前前半部分链表
fast = slow;
slow = slow.next;
fast.next = null;
//翻转链表
ListNode lastHead = ReverseNode(slow);
ListNode newHead = head;
head = head.next;
//合并链表
while(head != null && lastHead != null){
newHead.next = lastHead;
lastHead = lastHead.next;
newHead = newHead.next;
newHead.next = head;
head = head.next;
newHead = newHead.next;
}
if(head != null)
newHead.next = head;
if(lastHead != null)
newHead.next = lastHead;
}
private ListNode ReverseNode(ListNode head){
ListNode prev = null;
ListNode curr = head;
while(curr != null && curr.next != null){
ListNode next = curr.next;
curr.next = prev;
prev = curr;
curr = next;
}
curr.next = prev;
return curr;
}
}
给定一个单链表,重排它使得元素按L 0→L n →L 1→L n-1→L 2→L n-2→…的顺序排列。要求原地操作,不改变节点值。解题思路包括使用快慢指针找中间节点,断开链表并翻转后半部分,最后合并两个链表。

8149

被折叠的 条评论
为什么被折叠?



