数据结构与算法之 leetcode 链表分割 小于 x 节点前置

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


链表分割:将链表分割为小于x的节点和大于等于x的节点

链表是一种常见的数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。在LeetCode等编程竞赛平台中,链表操作是一个常见的题目类型。本文将围绕链表分割这一主题,探讨如何将链表分割为小于x的节点和大于等于x的节点。

链表分割问题要求我们将一个链表按照某个值x分割成两个子链表:一个子链表包含所有小于x的节点,另一个子链表包含所有大于等于x的节点。分割后,两个子链表应该保持原有的顺序。

链表分割算法

算法思路

1. 创建两个新的链表头节点,分别用于存储小于x的节点和大于等于x的节点。

2. 遍历原链表,根据节点的值将其添加到对应的子链表中。

3. 将两个子链表的尾部连接起来,形成最终的分割链表。

代码实现

以下是一个使用Python实现的链表分割算法:

python

class ListNode:


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


self.val = val


self.next = next

def partition(head, x):


创建两个新的链表头节点


less_head = ListNode(0)


more_head = ListNode(0)



创建两个指针,用于遍历原链表和构建新链表


less = less_head


more = more_head



遍历原链表


while head:


if head.val < x:


将小于x的节点添加到less链表


less.next = head


less = less.next


else:


将大于等于x的节点添加到more链表


more.next = head


more = more.next


head = head.next



将more链表的尾部设置为None,防止形成环


more.next = None



将less链表的尾部与more链表的头部连接起来


less.next = more_head.next



返回分割后的链表头节点


return less_head.next

测试代码


def print_list(node):


while node:


print(node.val, end=' ')


node = node.next


print()

创建测试链表


head = ListNode(1, ListNode(4, ListNode(3, ListNode(2, ListNode(5, ListNode(2))))))


x = 3

分割链表


new_head = partition(head, x)

打印分割后的链表


print_list(new_head)


算法分析

- 时间复杂度:O(n),其中n为链表长度。我们需要遍历整个链表一次。

- 空间复杂度:O(1),我们只需要常数级别的额外空间来存储两个新的链表头节点和两个指针。

总结

链表分割是一个经典的链表操作问题。通过创建两个新的链表头节点,我们可以将原链表分割成两个子链表,分别包含小于x的节点和大于等于x的节点。本文介绍了链表分割算法的思路、代码实现和算法分析,希望能对读者有所帮助。在实际应用中,链表分割算法可以用于各种场景,如数据排序、查找等。