链表划分

来源:互联网 发布:超盟数据李健豪 编辑:程序博客网 时间:2024/06/14 22:57

题目描述:给定一个单链表和数值x,划分链表使得所有小于x的节点排在大于等于x的节点之前。你应该保留两部分内链表节点原有的相对顺序。

样例:给定链表 1->4->3->2->5->2->null,并且 x=3,返回 1->2->2->4->3->5->null

我们可以发现,许多关于数组的操作也会用到链表上,因为数组和链表从本质上讲存储的都是“一列有顺序的元素”。但是由于链表的结构特性,对于链表的操作总会比对于数组要复杂一些。

这道题也是一样,想一想在划分数组的时候,是通过遍历+交换的方法实现的,而交换节点这个事一向比较费事,很考验编程技巧。

所以,仅仅就解决这道题而言,我们可以用另外一种更简单地方法:我给它起名叫做“摘除法”。什么意思呢,就是设定一个或多个新的节点,然后对给出的链表扫描,将符合相应特征的节点从给出的链表中“摘除”出来,连在新建的节点上。之前,我们做过的“链表的插入排序”(详见:点击打开链接),“合并两个排序链表”(详见:点击打开链接)其实用的都是这种方法。

放到这道题呢,可以建立两个节点,一个后面跟进值小于x的节点,另一个后面跟进大于x的。然后整个原始链表遍历完之后,再将现在新建的两个链表合并,划分就完成了。

代码如下:

"""Definition of ListNodeclass ListNode(object):    def __init__(self, val, next=None):        self.val = val        self.next = next"""class Solution:    """    @param head: The first node of linked list.    @param x: an integer    @return: a ListNode     """    def partition(self, head, x):        if head is None:            return head        # 新建两个节点        first = ListNode(-1)        second = ListNode(-1)        cur1, cur2 = first, second        # 遍历原始链表        while head:            if head.val < x:                cur1.next = head                head = head.next                cur1 = cur1.next            else:                cur2.next = head                head = head.next                cur2 = cur2.next        # 合并        cur1.next = second.next        cur2.next = None        return first.next        # write your code here


0 0
原创粉丝点击