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