力扣第143题,重排链表(递归方法)

该文章描述了一种通过递归方法重新排列链表节点的算法。首先找到链表的尾节点,然后将尾节点移动到头节点之后,接着对剩余部分进行递归处理,每次递归时减少长度。这种方法在不使用额外空间的情况下,通过调整节点连接实现链表的重排。
摘要由CSDN通过智能技术生成

 

通过示例可以看出, 需要把链表的最后一个节点依次往前提,因此需要找到尾节点,如示例二所示,第一次找到尾节点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);//进入递归
}

由于每次都要找到尾节点,因此需要的时间较长,但不需要设置额外的空间。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值