leetcode 328. 奇偶链表

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

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

示例 1:

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

输入: 2->1->3->5->6->4->7->NULL
输出: 2->3->6->7->1->5->4->NULL
说明:

应当保持奇数节点和偶数节点的相对顺序。
链表的第一个节点视为奇数节点,第二个节点视为偶数节点,以此类推。


将整条链表分为奇偶两条链表,再把两条链表连接起来就可以。

  • 首先是判断特殊情况,链表为空,或者链表内的只有一个数,那么直接返回链表。
  • 取第一个数开始为寄链表,取第二个数开始为偶链表。
  • 判断奇链表和偶链表的后面是否为空,级链表的后面一位就是偶链表的最后一位,所以开始的时候如果奇链表的后面是有值的,就看偶链表后面是否有值。
  • 如果偶链表后面有值,那么奇链表就可以接这个数,例如[1,2,3],1就可以接3,然后奇链表头后移,偶链表接奇链表的下一个。
  • 为啥不可以只判断偶链表的尾部了?例如[1,2,3]一次循环之后为 1-3, 2-None,这时候我们None没有next, 3的next为空,说明
    链的长度是奇数,偶数可能会直接连上None,导致无法判断next.
  • while循环的判断条件只能是先odd.next 再even.next。总个数为奇数的时候:先判断奇数的下一个,再判断偶数的下一个。
  • 总个数为偶数的时候,由于奇数的next是下一个偶数,所以有效。但是偶数的下一个为空,无效。所以需要注意一下这里的循环判断条件的次序,以及为什么这么设置循环条件。
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def oddEvenList(self, head: ListNode) -> ListNode:
        if (not head) or (not head.next): return head
        node = head#头节点

        odd = head#奇数链
        evenStart = head.next
        even = head.next#偶数链
        while odd.next and even.next:#注意这里的判断条件,先奇数,再偶数
            odd.next = even.next
            odd = odd.next
            even.next = odd.next
            even = even.next
        odd.next = evenStart
        return node
            
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值