剑指 Offer II 026. 重排链表
给定一个单链表 L 的头节点 head ,单链表 L 表示为:
L0 → L1 → … → Ln-1 → Ln
请将其重新排列后变为:
L0 → Ln → L1 → Ln-1 → L2 → Ln-2 → …
不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例:
输入: head = [1,2,3,4]
输出: [1,4,2,3]
我采用的方式debug+快慢指针求中间结点+反转有部分链表+选取新链表依次连接左右链表+难点(注意奇偶数)
直接上代码:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public void reorderList(ListNode head) {
ListNode fast=head;
ListNode slow=head;
ListNode temp=head;
while(fast!=null && fast.next!=null)
{
temp=slow;
fast=fast.next.next;
slow=slow.next;
}
ListNode next;
//mid是截止奇数的时候中间结点,添加到最后
ListNode mid=head;
if(fast!=null)
{
next=slow.next;
slow.next=null;
mid=slow;
slow=next;
}
temp.next=null;
//反转链表
ListNode prev=null;
ListNode cur=slow;
ListNode tmp;
while(cur!=null)
{
tmp=cur.next;
cur.next=prev;
prev=cur;
cur=tmp;
}
//head 1.2 prev=3.4
//组合链表
ListNode dummyHead=new ListNode();
ListNode cur4=dummyHead;
ListNode cur2=head;
ListNode cur3=prev;
ListNode next2;
ListNode next3;
while(cur3!=null){
next2=cur2.next;
cur2.next=null;
cur4.next=cur2;
cur2=next2;
cur4=cur4.next;
next3=cur3.next;
cur3.next=null;
cur4.next=cur3;
cur3=next3;
cur4=cur4.next;
}
//奇数个考虑添加中间结点到最后
if(fast!=null) cur4.next=mid;
head=cur4.next;
}
}
有疑问可以在评论区写出来,我会及时回复!