链表分割:将链表分割为小于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的节点。本文介绍了链表分割算法的思路、代码实现和算法分析,希望能对读者有所帮助。在实际应用中,链表分割算法可以用于各种场景,如数据排序、查找等。
Comments NOTHING