BM14-链表的奇偶重排

该博客讨论了如何在O(n)的时间和空间复杂度内,重新排列一个单链表,使得奇数位置的节点和偶数位置的节点分别相邻。通过创建奇链表和偶链表,然后连接这两个链表来实现这一目标。给出的示例展示了如何将1->2->3->4->5->6重排为1->3->5->2->4->6。代码中使用了迭代方法处理链表节点,确保了操作的效率。
摘要由CSDN通过智能技术生成

题目:

给定一个单链表,请设定一个函数,将链表的奇数位节点和偶数位节点分别放在一起,重排后输出。注意是节点的编号而非节点的数值。

数据范围:节点数量满足 0≤n≤10^5,节点中的值都满足 0≤val≤1000。

要求:空间复杂度 O(n),时间复杂度 O(n)。

示例1

输入:{1,2,3,4,5,6}                      

返回值:{1,3,5,2,4,6}

说明:1->2->3->4->5->6->NULL

重排后为:1->3->5->2->4->6->NULL

示例2

输入:{1,4,6,3,7}                         

返回值:{1,6,7,4,3}

说明:1->4->6->3->7->NULL

重排后为:1->6->7->4->3->NULL

奇数位节点有1,6,7,偶数位节点有4,3。重排后为1,6,7,4,3

备注:链表长度不大于200000。每个数范围均在int内。


思路:

分别定义一个奇链表和一个偶链表以及一个衔接链表,遍历原链表,将链表的奇数位节点和偶数位节点分别放在一起,构成奇链表和偶链表,再衔接奇链表和偶链表。


代码:

import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 *   public ListNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 
     * @param head ListNode类 
     * @return ListNode类
     */
    public ListNode oddEvenList (ListNode head) {
        // write code here
        //边界条件的判断
        if(head == null){
            return head;
        }
        
        //定义一个奇链表和一个偶链表
        ListNode j = head;
        ListNode o = head.next;
        //定义一个衔接链表,用来将奇链表和偶链表进行衔接
        ListNode xj = head.next;

        //将链表的奇数位节点和偶数位节点分别放在一起
        while(o != null && o.next != null){
            //1的下一个位置指向3
            j.next = o.next;
            //j的位置指向3
            j = j.next;
            //2的下一个位置指向4
            o.next = j.next;
            //o的位置指向4
            o = o.next;
        }

        //衔接奇链表和偶链表
        j.next = xj;

        return head;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值