LeetCode 328. 奇偶链表(Java代码)

前往LeetCode做题

题目描述

给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。

请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes 为节点总数。

输入输出样例

输入: 1->2->3->4->5->NULL
输出: 1->3->5->2->4->NULL

题解

奇数节点放在前面,偶数节点放在后面,并且相对顺序不能改变。

可以想到应该需要两个指针,分别承担建立两个链表的重任。同时,需要注意的是,如何将偶数链表拼接到奇数链表的后面,势必需要第三个节点。

链表的这类题,可以通过画图,从图上获得一点启示

class Solution {
    public ListNode oddEvenList(ListNode head) {
        if(head == null) return null;
        ListNode odd = head; ListNode even = head.next; ListNode evenHead = even;
        while(even != null && even.next != null){
        	// 奇数链表的下一个,是偶数链表.next
            odd.next = even.next;
            odd = odd.next;
            // 奇数链表的节点,新增了一个,刚好是在自己屁股后面,
            // 那么odd.next就是偶数节点
            even.next = odd.next;
            even = even.next;
        }
        odd.next = evenHead;
        return head;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值