解题思路
主要算法:递归
题意就是把一条方向是从左向右的单链表变成下图这种螺旋状
可以发现对于所有弧,弧尾的结点是从左向右的,弧头的结点是从右向左的,
于是可以考虑双指针,一个放在弧尾结点,一个放在弧头结点
但是单链表不能让指针往前,于是考虑递归 用递归使指针回到之前的结点
这里采用了规定指向弧头的指针递归起始时的结点位置,以方便递归的结束
然后对于链表奇偶长度,进行了不同的边际特判(还没仔细考虑过能否合二为一)
代码
/**
* 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 {
ListNode l,r;
int len;
public void reorderList(ListNode head) {
len=0;
ListNode temp=head;
while(temp!=null){
temp=temp.next;
len++;
}
int mid;
if(len%2==1) {
mid=(len+1)/2;
}else{
mid=len/2;
}
l=head;
r=head;
//规定要进行递归的指向弧头结点指针的递归起始位置
for(int i=1;i<=mid;i++){
r=r.next;
}
func(r);
return;
}
private void func(ListNode r){
if(r==null) {
return;
}
func(r.next);
ListNode temp=l;
l=l.next;
temp.next=r;
r.next=l;
//分奇偶的边际判断
if(len%2==1){
if(l.next==r) {
l.next=null;
}
}else{
if(r.next==r) {
r.next=null;
}
}
return;
}
}