力扣刷题---143.重排链表

143. 重排链表

在这里插入图片描述

解题思路

主要算法:递归

题意就是把一条方向是从左向右的单链表变成下图这种螺旋状
可以发现对于所有弧,弧尾的结点是从左向右的,弧头的结点是从右向左的,
于是可以考虑双指针,一个放在弧尾结点,一个放在弧头结点
但是单链表不能让指针往前,于是考虑递归 用递归使指针回到之前的结点

这里采用了规定指向弧头的指针递归起始时的结点位置,以方便递归的结束
然后对于链表奇偶长度,进行了不同的边际特判(还没仔细考虑过能否合二为一)
在这里插入图片描述

代码

/**
 * 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;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值