NC2-重排链表-【链表】

题目链接:

重排链表_牛客题霸_牛客网 (nowcoder.com)

分三步:

  1. 利用快慢指针,找到原链表的中点
  2. 将后半部分链表进行翻转
  3. 将反转之后的后半部分链表依次插入前半部分链表的间隔中。

 python实现:

# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

#
# 
# @param head ListNode类 
# @return void
#
class Solution:
    def findMidNode(self, head):  # 找中点
        fast, slow = head, head
        while fast and fast.next:
            fast = fast.next.next
            slow = slow.next
        # 当跳出while循环时,slow指向的正是原链表的中点,fast指向的是原链表的最后一个节点
        midNextNode = slow.next
        slow.next = None # 与firstHalf断开,只返回secondHalf的head
        return midNextNode
    
    def reverseSecondHalf(self, secondHalfHead):  # 翻转
        pre = None
        cur = secondHalfHead
        while cur:
            curNext = cur.next
            cur.next = pre 
            
            pre = cur
            cur = curNext
        rSecondHalfHead = pre   # 对后半部分翻转后的链表的头节点
        return rSecondHalfHead
    
    def reorderList(self , head ):   # 重排
        # write code here
        if head == None:
            return 
        secondHalfHead = self.findMidNode(head) 
        rSecondHalfHead = self.reverseSecondHalf(secondHalfHead)
        temp1, temp2 = head, rSecondHalfHead
        while temp1 and temp2:
            temp1Next = temp1.next
            temp1.next = temp2
            temp2Next = temp2.next
            temp2.next = temp1Next
            
            temp1 = temp1Next
            temp2 = temp2Next

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值