数据结构与算法之 leetcode 链表奇偶链表 奇偶节点分离

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


摘要:

链表是数据结构中的一种常见类型,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。在LeetCode中,链表问题是一个高频考点。本文将围绕LeetCode中的“奇偶链表”问题,深入探讨其数据结构与算法实现,旨在帮助读者更好地理解和解决类似问题。

一、问题背景

给定一个单链表的头节点head,请将链表中的节点重新排列,使得奇数位于偶数之前。请保持奇数节点和偶数节点的相对顺序。

示例:

输入:1->2->3->4->5->NULL

输出:1->3->5->2->4->NULL

二、数据结构分析

在解决这个问题之前,我们需要了解链表的基本数据结构。链表由节点组成,每个节点包含两个部分:数据和指针。数据部分存储节点的值,指针部分指向链表中的下一个节点。

对于奇偶链表问题,我们需要关注以下数据结构:

1. 节点(ListNode):表示链表中的单个节点,包含数据和指针。

2. 链表(LinkedList):表示整个链表,包含头节点和节点列表。

三、算法思路

为了解决这个问题,我们可以采用以下步骤:

1. 创建两个指针,分别指向奇数节点和偶数节点。

2. 遍历链表,将奇数节点和偶数节点分别连接到对应的链表中。

3. 将奇数链表的最后一个节点指向偶数链表的第一个节点。

四、代码实现

以下是使用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 = 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

测试代码


def print_list(node):


while node:


print(node.val, end="->")


node = node.next


print("NULL")

创建链表


head = ListNode(1)


head.next = ListNode(2)


head.next.next = ListNode(3)


head.next.next.next = ListNode(4)


head.next.next.next.next = ListNode(5)

调用函数


result = oddEvenList(head)


print_list(result)


五、总结

本文针对LeetCode中的“奇偶链表”问题,从数据结构、算法思路和代码实现等方面进行了详细解析。通过分析问题,我们了解到链表的基本数据结构,并提出了有效的解决方案。在实际编程过程中,我们可以根据具体问题选择合适的数据结构和算法,以提高代码的效率和可读性。

在解决类似问题时,我们需要关注以下几点:

1. 理解问题背景和需求。

2. 分析数据结构,确定解决方案。

3. 编写代码,实现算法。

4. 测试代码,确保其正确性。

希望本文能对您在解决LeetCode链表问题有所帮助。