给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。请尝试使用原地算法完成。

力扣原题:

 先贴代码:

public class Solution328 {
    public ListNode oddEvenList(ListNode head) {
        //当链表为空时,直接返回
        if (head == null){
            return head;
        }
        //创建节点oddnum和节点evennum,始终指向奇数和偶数的最后一个节点
        ListNode oddnum = head;
        ListNode evennum = head.next;
        //当evennum为最后一个节点时循环结束
        while (evennum != null && evennum.next != null){
            //创建一个cur指针,指向evennum的后继节点
            ListNode cur = evennum.next;
            //将evennum后面的那个奇数节点移到前面
            evennum.next = cur.next;
            cur.next = oddnum.next;
            oddnum.next = cur;
            //evennum和oddnum后移一步
            oddnum = oddnum.next;
            evennum = evennum.next;
        }
        return head;
    }
}

思路解析:

本题中要求我们将奇数节点和奇数节点排在一起,偶数节点和偶数节点排在一起,奇数和偶数指的是节点的编号;并且还要我们使用原地算法完成。所以我们就需要直接在链表内进行操作。

因为需要将一条链表分为奇数部分和偶数部分,所以我们先创建两个指针oddnum(奇数)和evennum(偶数),分别指向奇数部分的最后一个节点和偶数部分的最后一个节点,这样就可以将evennum的后继节点移至oddnum的后面,因为evennum指向的是偶数节点,所以它的后继节点一定是奇数的节点。

将evennum的后继节点移至oddnum后面后,再把它们两个都往后移动一步,这样就会始终指向奇数或者偶数部分的最后一个节点。

因为题目要求奇数部分在前,偶数部分在后,所以我们就可以用evennum来判断循环结束:当evennum为空或者evennum的后继节点为空时,表示链表已经全部走完,此时就可以结束循环了。最后返回head头节点。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值