码迷,mamicode.com
首页 > 其他好文 > 详细

lintcode_99.重排链表

时间:2017-12-26 11:53:35      阅读:120      评论:0      收藏:0      [点我收藏+]

标签:color   lis   bsp   class   list   排列   空间   tco   one   

给定一个单链表L: L0→L1→…→Ln-1→Ln,

重新排列后为:L0→Ln→L1→Ln-1→L2→Ln-2→…

必须在不改变节点值的情况下进行原地操作。

样例

给出链表 1->2->3->4->null,重新排列后为1->4->2->3->null

思路:

将链表一分为二,后半段逆序插入前半段。

参考九章:使用快慢指针(在判断链表是否含环路时使用过)

class Solution:
    """
    @param head: The first node of the linked list.
    @return: nothing
    """
    def reorderList(self, head):
        # write your code here
        if None == head or None == head.next:
            return head

        pfast = head
        pslow = head
        
        while pfast.next and pfast.next.next:
            pfast = pfast.next.next
            pslow = pslow.next  
        pfast = pslow.next
        pslow.next = None   #此时pfast指向中间元素的后一个元素,pslow指向中间元素。已将链表一分为二
        
        pnext = pfast.next  #辅助指针,用于逆置后半段链表
        pfast.next = None
        while pnext:      #将后半段逆置,逆置完pnext为空,pfast为最后一个元素
            q = pnext.next
            pnext.next = pfast
            pfast = pnext
            pnext = q

        tail = head
        while pfast:      #将后半段合并插入前半段
            pnext = pfast.next
            pfast.next = tail.next
            tail.next = pfast
            tail = tail.next.next
            pfast = pnext
        return head

这题难度在于不能使用额外空间,需仔细考虑指针的指向,需要多个辅助指针帮助逆置合并等操作

lintcode_99.重排链表

标签:color   lis   bsp   class   list   排列   空间   tco   one   

原文地址:https://www.cnblogs.com/zhangli-ncu/p/8116872.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!