[Leetcode学习]Odd Even Linked List(奇偶链表排序)

问题:

难度medium

把链表下标为基数的节点放到链表前部,链表下标偶数的,放到链表后部。

输入输出案例:

Input: 1->2->3->4->5->NULL
Output: 1->3->5->2->4->NULL // 1 3 5奇数丢到前部,其余丢到后部

我的代码:

我的算法思想也简单,就是建立一条奇数链,一条偶数链,然后两个奇数在前,偶数在后连起来就是。

用了递归,也可以用循环算法,递归相对来说思考简单,不过全局变量设置较多,而且代码相对较长。

class Solution {
    ListNode oddNode;
    ListNode evenNode;
    ListNode oddTail;
    public ListNode oddEvenList(ListNode head) {
        if(head != null) {
            reverNode(head, 1); // 先拍出奇偶链,下标从1开始
            if(oddTail != null) {
                oddTail.next = evenNode;
                head.next = oddNode;
            }
            else {
                head.next = evenNode;
            }
        }
        return head;
    }
    
    public ListNode reverNode(ListNode head, int index) {
        if(head.next != null) {
            ListNode next = reverNode(head.next, ++ index); // 递归到最后,index也自增
            if(index % 2 == 1) { // 奇数就放奇数链,偶数放偶数链
                if(oddTail == null) oddTail = next;
                next.next = oddNode;
                oddNode = next;
            } else {
                next.next = evenNode;
                evenNode = next;
            }
        }
        return head;
    }
}

 

其他代码:

再简洁点就是用指针思想,并且是使用循环

class Solution {
    public ListNode oddEvenList(ListNode head) {
        if(head==null || head.next==null || head.next.next==null){
            return head;
        }
        ListNode dummyOdd = head;
        ListNode dummyEven = head.next;
        ListNode headEven=dummyEven;    // 记录偶数节点头部
        while(dummyEven!=null && dummyEven.next!=null){
            // 1、这里和3是相似,odd下一个是even下一个
            dummyOdd.next=dummyEven.next;
            // 然后跳到下一个奇数节点
            dummyOdd=dummyEven.next;

            // 2、如果奇数节点下一个为null,偶数就指向null
            if(dummyOdd.next==null){
                dummyEven.next=null;
            } else {
                // 3、这里和1是相似,even下一个是odd下一个,判空再while那里
                dummyEven.next=dummyOdd.next;
                dummyEven=dummyEven.next;
            }
        }
        dummyOdd.next=headEven; // 最后合并就是
        return head;
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值