通过示例可以看出, 需要把链表的最后一个节点依次往前提,因此需要找到尾节点,如示例二所示,第一次找到尾节点5需要的次数为4,第二次从2出发,找到尾节点的次数为2。设一共有n个点,第一次找到尾节点的次数为n-1,移动后从下一个节点出发,需要找到尾节点的次数依次减二,因此可以通过递归的方式进行移动。先记录第一次找到尾节点需要的次数,每次递归的时候长度减二。
代码如下:
void digui(struct ListNode *head,int count){
struct ListNode *p,*q;//定义两个指针,一个指向头节点,一个指向尾节点
p=head,q=head;
int i=0,j=0;
for(;j<count;j++){//通过for循环找到尾节点的位置
q=q->next;
}
if(count==1||count==0){/*如果count为1or0,则说明已经重拍完成,将尾节点的next值设为null,结束循环*/
q->next=NULL;
return;
}
q->next=p->next;
p->next=q;//将尾节点接到头节点的下一个
if(p->next==NULL) return ;
digui(p->next->next,count-2);//继续递归,并将头节点的next->next地址设为头节点以及将长度减二
}
//1 5 2 4 3
void reorderList(struct ListNode* head){
struct ListNode *p;
p=head;
int count=0;
while(p){
p=p->next;
if(!p) break;
count++;//记录找到尾节点需要的次数
}
digui(head,count);//进入递归
}
由于每次都要找到尾节点,因此需要的时间较长,但不需要设置额外的空间。