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
-
class ListNode:
定义一个单链表的节点类ListNode
。每个节点包含两个属性:val
:节点的值。next
:指向下一个节点的指针(默认为None
,表示没有后续节点)。
-
def __init__(self, val=0, next=None):
定义节点的构造函数,用于初始化节点的值 (val
) 和指针 (next
)。- 默认情况下,节点的值为
0
,指针为None
。
- 默认情况下,节点的值为
定义解决方案类和方法:
python
运行复制
class Solution:
def oddEvenList(self, head: Optional[ListNode]) -> Optional[ListNode]:
-
class Solution:
定义一个解决方案类Solution
,其中包含一个方法oddEvenList
来解决奇偶链表问题。 -
def oddEvenList(self, head: Optional[ListNode]) -> Optional[ListNode]:
定义oddEvenList
方法,该方法接收一个链表的头节点head
,返回重新排列后的链表头节点。- 输入参数
head
是一个链表节点(或None
)。 - 返回值是重新排列后的链表头节点(或
None
)。
- 输入参数
判断链表是否为空或只有一个节点:
python
运行复制
if not head or not head.next:
return head
-
if not head
如果链表为空(head
为None
),直接返回head
。已经满足题目要求,无需处理。 -
or not head.next
如果链表只有一个节点(head.next
为None
),直接返回head
。无需重新排列。
初始化指针:
python
运行复制
odd = head
even = head.next
even_head = even # Keep the head of the even list
-
odd = head
定义一个指针odd
,指向链表的第一个节点(奇数节点的起点)。 -
even = head.next
定义一个指针even
,指向链表的第二个节点(偶数节点的起点)。 -
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
-
while even and even.next:
使用while
循环,直到偶数节点或其后续节点不存在时结束循环。even
:检查当前偶数节点是否存在。even.next
:检查偶数节点的下一个节点是否存在。
-
odd.next = even.next
将当前奇数节点的next
指针,指向下一个奇数节点(跳过当前偶数节点)。 -
odd = odd.next
将odd
指针移动到下一个奇数节点。 -
even.next = odd.next
将当前偶数节点的next
指针,指向下一个偶数节点(跳过当前奇数节点)。 -
even = even.next
将even
指针移动到下一个偶数节点。
此循环的作用是将奇数节点和偶数节点分开,同时保持链表的相对顺序。
连接奇数和偶数链表:
python
运行复制
odd.next = even_head
odd.next = even_head
循环结束后,所有奇数节点已经排列好,odd
指针指向最后一个奇数节点。
将此节点的next
指针,连接到偶数链表的头节点even_head
,完成链表的重新排列。
返回重新排列后的链表头节点:
python
运行复制
return head
return head
返回重新排列后的链表头节点(原链表的头节点head
没有改变)。
总结:
这段代码的核心逻辑是:
- 使用两个指针分别追踪奇数节点和偶数节点。
- 通过跳跃的方式将奇数节点和偶数节点分组。
- 最后将奇数链表与偶数链表连接起来,完成重新排列。
示例运行:
输入链表:
1 -> 2 -> 3 -> 4 -> 5
过程:
-
初始化指针:
- 奇数链表起点:
1
- 偶数链表起点:
2
- 奇数链表起点:
-
第一次循环:
- 奇数链表:
1 -> 3
- 偶数链表:
2 -> 4
- 奇数链表:
-
第二次循环:
- 奇数链表:
1 -> 3 -> 5
- 偶数链表:
2 -> 4
- 奇数链表:
-
连接链表:
- 结果链表:
1 -> 3 -> 5 -> 2 -> 4
- 结果链表:
返回结果:
1 -> 3 -> 5 -> 2 -> 4