java数据结构与算法刷题-----LeetCode328. 奇偶链表

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846

在这里插入图片描述

解题思路

将链表按奇偶顺序,分成两个链表。最后将偶数链表放在奇数链表后面,下图中,even表示偶数下标,odd表示奇数下标,evenhead表示奇数链表的头结点
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码:时间复杂度O(n) 空间复杂度O(1):因为上面图解中的代码量少,但是比较难以理解,所以我会给出两个版本的代码,第一个代码量少,第二个更容易理解,但是两种版本效率是完全一样的。
  1. 代码量少的
    在这里插入图片描述
/**
 * 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 {
    public ListNode oddEvenList(ListNode head) {
        if(head == null || head.next == null) return head;
        ListNode odd = head;//指向奇数下标的头结点,并充当遍历结点
        ListNode evenHead = head.next; //指向偶数下标的头结点
        ListNode even = headB;//even表示偶数结点
        while(even!=null&&even.next!=null){//如果有结点可以遍历
            odd.next = even.next;//even指向偶数结点,那么它的下一个必然是奇数结点。放入奇数链表
            odd = odd.next;//奇数链表指针odd后移,那么odd的下一个就是偶数结点了
            even.next = odd.next;//让odd后面这个偶数结点,加入到偶数链even中
            even = even.next;//even后移,再次到偶数结点
        }
        odd.next = evenHead;//将偶数头结点,放到奇数链表末尾
        return head;//返回重新排列的链表
    }
}
  1. 代码量大的,但更容易理解。
    在这里插入图片描述
class Solution {
    public ListNode oddEvenList(ListNode head) {
        if(head == null || head.next == null) return head;
        ListNode headA = head;//headA表示奇数链表头结点
        ListNode headB = head.next; //headB表示偶数链表头结点
        ListNode current = headB.next;//current表示下一个该遍历的结点
        ListNode currentA = headA,currentB = headB;//currentA和currentB是奇偶两个链表的遍历指针
        boolean flag = true;//flag = true表示当前结点应该插入到奇数链表
        while(current!=null){//如果有结点可遍历
            currentA.next = null;currentB.next = null;//防止环的存在
            if(flag==true){//放headA中,表示奇数下标
                currentA.next = current;//插入到奇数链表尾部
                currentA = currentA.next;//奇数链表指针后移
                flag = false;//下一次插入偶数链表
            }else{
                currentB.next = current;
                currentB = currentB.next;
                flag = true;
            }
            current = current.next;//原链表指针后移
        }
        currentA.next = headB;//最后将偶数链表插入到奇数链表后面
        return headA;//返回新链表
    }
}
  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

殷丿grd_志鹏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值