数据结构与算法之 leetcode 链表奇偶分组优化 单指针遍历

数据结构与算法阿木 发布于 4 天前 1 次阅读


链表奇偶分组优化(单指针遍历)——LeetCode算法挑战

链表是数据结构中的一种,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。链表的操作通常包括插入、删除、查找等。在LeetCode等编程竞赛平台上,链表相关的题目是常见的题型之一。本文将围绕LeetCode上的“链表奇偶分组优化(单指针遍历)”这一主题,探讨如何使用单指针遍历链表来实现奇偶分组的优化算法。

题目描述

给定一个单链表的头节点head,将链表中的节点重新排列,使得奇数位于偶数之前。请返回重新排列后的链表的头节点。

解题思路

为了实现奇偶分组,我们可以使用两个指针,一个用于遍历奇数节点,另一个用于遍历偶数节点。以下是具体的步骤:

1. 初始化两个指针:`odd`指向奇数节点的头部,`even`指向偶数节点的头部。

2. 使用一个辅助指针`evenOdd`来遍历整个链表,用于连接奇数节点和偶数节点。

3. 在遍历过程中,将奇数节点连接到`odd`指针的下一个节点,并将`odd`指针移动到下一个奇数节点。

4. 同样,将偶数节点连接到`even`指针的下一个节点,并将`even`指针移动到下一个偶数节点。

5. 将`odd`指针指向偶数节点的头部,完成奇偶分组的连接。

代码实现

以下是用Python语言实现的代码:

python

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, even, even_head = head, head.next, head.next



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

测试代码


def print_list(node):


while node:


print(node.val, end=" ")


node = node.next


print()

创建链表


node1 = ListNode(1)


node2 = ListNode(2)


node3 = ListNode(3)


node4 = ListNode(4)


node5 = ListNode(5)


node1.next = node2


node2.next = node3


node3.next = node4


node4.next = node5

执行函数


rearranged_head = oddEvenList(node1)


print_list(rearranged_head) 输出应为 1 3 5 2 4


优化分析

1. 空间复杂度:该算法的空间复杂度为O(1),因为我们没有使用额外的数据结构来存储节点。

2. 时间复杂度:该算法的时间复杂度为O(n),其中n是链表的长度。我们只需要遍历链表一次即可完成奇偶分组。

总结

本文通过LeetCode上的“链表奇偶分组优化(单指针遍历)”这一题目,介绍了如何使用单指针遍历链表来实现奇偶分组的优化算法。通过分析算法的复杂度,我们可以看到该算法在时间和空间上都是高效的。在实际应用中,这种单指针遍历的方法可以用于解决更多与链表相关的算法问题。