力扣328、奇偶链表问题(Odd-Even Linked List)

class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

def oddEvenList(head):
    if not head or not head.next:
        return head

    # 初始化指针
    odd = head
    even = head.next
    even_head = even  # 保存偶数链表的头节点

    # 遍历链表,重新排列
    while even and even.next:
        odd.next = even.next  # 奇数节点连接到下一个奇数节点
        odd = odd.next        # 移动奇数指针
        even.next = odd.next  # 偶数节点连接到下一个偶数节点
        even = even.next      # 移动偶数指针

    # 将奇数链表尾部连接到偶数链表头部
    odd.next = even_head

    return head

下面是对这段代码逐行的详细解释:


定义节点类:

python

运行复制

class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next
  1. class ListNode:
    定义一个单链表的节点类 ListNode。每个节点包含两个属性:

    • val:节点的值。
    • next指向下一个节点的指针(默认为 None,表示没有后续节点)。
  2. def __init__(self, val=0, next=None):
    定义节点的构造函数,用于初始化节点的值 (val) 和指针 (next)。

    • 默认情况下,节点的值为 0,指针为 None

定义解决方案类和方法:

python

运行复制

class Solution:
    def oddEvenList(self, head: Optional[ListNode]) -> Optional[ListNode]:
  1. class Solution:
    定义一个解决方案类 Solution,其中包含一个方法 oddEvenList 来解决奇偶链表问题。

  2. def oddEvenList(self, head: Optional[ListNode]) -> Optional[ListNode]:
    定义 oddEvenList 方法,该方法接收一个链表的头节点 head,返回重新排列后的链表头节点。

    • 输入参数 head 是一个链表节点(或 None)。
    • 返回值是重新排列后的链表头节点(或 None)。

判断链表是否为空或只有一个节点:

python

运行复制

if not head or not head.next:
    return head
  1. if not head
    如果链表为空(headNone),直接返回 head。已经满足题目要求,无需处理。

  2. or not head.next
    如果链表只有一个节点(head.next None),直接返回 head。无需重新排列。


初始化指针:

python

运行复制

odd = head
even = head.next
even_head = even  # Keep the head of the even list
  1. odd = head
    定义一个指针 odd,指向链表的第一个节点(奇数节点的起点)。

  2. even = head.next
    定义一个指针 even,指向链表的第二个节点(偶数节点的起点)。

  3. even_head = even
    保存偶数链表的头节点(even 的初始值)。这是为了在后续操作中,将奇数链表的尾部连接到偶数链表的头部。


重新排列奇偶节点:

python

运行复制

while even and even.next:
    odd.next = even.next  # Link current odd node to the next odd node
    odd = odd.next        # Move odd pointer forward
    even.next = odd.next  # Link current even node to the next even node
    even = even.next      # Move even pointer forward
  1. while even and even.next:
    使用 while 循环,直到偶数节点或其后续节点不存在时结束循环。

    • even:检查当前偶数节点是否存在。
    • even.next:检查偶数节点的下一个节点是否存在。
  2. odd.next = even.next
    将当前奇数节点的 next 指针,指向下一个奇数节点(跳过当前偶数节点)。

  3. odd = odd.next
    odd 指针移动到下一个奇数节点。

  4. even.next = odd.next
    将当前偶数节点的 next 指针,指向下一个偶数节点(跳过当前奇数节点)。

  5. even = even.next
    even 指针移动到下一个偶数节点。

此循环的作用是将奇数节点和偶数节点分开,同时保持链表的相对顺序。


连接奇数和偶数链表:

python

运行复制

odd.next = even_head
  1. odd.next = even_head
    循环结束后,所有奇数节点已经排列好,odd 指针指向最后一个奇数节点。
    将此节点的 next 指针,连接到偶数链表的头节点 even_head,完成链表的重新排列。

返回重新排列后的链表头节点:

python

运行复制

return head
  1. return head
    返回重新排列后的链表头节点(原链表的头节点 head 没有改变)。

总结:

这段代码的核心逻辑是:

  1. 使用两个指针分别追踪奇数节点和偶数节点。
  2. 通过跳跃的方式将奇数节点和偶数节点分组。
  3. 最后将奇数链表与偶数链表连接起来,完成重新排列。

示例运行:

输入链表:

1 -> 2 -> 3 -> 4 -> 5

过程:
  1. 初始化指针:

    • 奇数链表起点:1
    • 偶数链表起点:2
  2. 第一次循环:

    • 奇数链表:1 -> 3
    • 偶数链表:2 -> 4
  3. 第二次循环:

    • 奇数链表:1 -> 3 -> 5
    • 偶数链表:2 -> 4
  4. 连接链表:

    • 结果链表:1 -> 3 -> 5 -> 2 -> 4
返回结果:

1 -> 3 -> 5 -> 2 -> 4

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值