leetcode876. 链表的中间结点python

题目描述:

 题解一:

一种很笨的办法:

1.先遍历一次链表,记录链表的长度listlen。

2.判断中间节点mid的位置,如果listlen为奇数,则mid=(listlen+1)/2,否则mid=listlen/2+1。

3.再次从head开始依次搜索链表,根据mid的位置确定中间节点。

class Solution(object):
    def middleNode(self, head):
        if head.next == None:
            return head
        node = head
        listlen = 0
        while node:
            listlen = listlen+1
            node = node.next
        if listlen%2==0:
            mid = listlen/2+1
        else:
            mid = (listlen+1)/2
        node = head
        now = 1
        while now!=mid:
            node = node.next
            now = now+1
        return node

 题解二:

利用快慢指针,slow每次向后移动一个节点,fast每次移动两个节点,当fast到达链表结尾时,slow在链表中间节点位置。

注意:由于题目要求有两个中点的时候返回第二个,因此当链表有偶数个节点时,fast在倒数第二个节点结束,此时slow在第一个中点处,需要返回slow.next。

class Solution(object):
    def middleNode(self, head):
        slow = head
        fast = head
        while fast.next and fast.next.next:
            slow = slow.next
            fast = fast.next.next
        if fast.next:
            return slow.next
        return slow

题解三:

前面两种方法都需要先把链表中节点的信息保存在一个数组中,题解三只需要遍历一次链表。

参考:Leetcode 19:删除链表的倒数第N个节点(最详细解决方案!!!)_coordinate的博客-CSDN博客

思路:

1.设置一个fake头节点,fake.next=head。

2.设置两个节点node1 node2初始为fake,将node2移动到从head开始向后两个节点的位置。

3.node1 node2分别从当前位置开始向后遍历,当node1到达链表结尾时,node2.next就是要删除的节点,设置node2.next =node2.next.next即可。

class Solution(object):
    def removeNthFromEnd(self, head, n):
        now = 0
        fake  = ListNode()
        fake.next = head
        node1 = fake
        node2  = fake
        while now!=n+1:
            node1 = node1.next
            now = now+1
        while node1!=None:
            node1 = node1.next
            node2 = node2.next
        node2.next = node2.next.next
        return fake.next

 

 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你好!对于LeetCode上的问题994.腐烂的橘子,你可以使用Python来解决。下面是一个示例代码: ```python from collections import deque def orangesRotting(grid): # 记录网格的行数和列数 row, col = len(grid), len(grid[0]) # 定义四个方向:上、下、左、右 directions = [(-1, 0), (1, 0), (0, -1), (0, 1)] # 使用队列来保存腐烂的橘子的位置 queue = deque() # 记录新鲜橘子的数量 fresh_count = 0 # 遍历整个网格,初始化队列和新鲜橘子的数量 for i in range(row): for j in range(col): if grid[i][j] == 2: # 腐烂的橘子 queue.append((i, j)) elif grid[i][j] == 1: # 新鲜橘子 fresh_count += 1 # 如果新鲜橘子的数量为0,直接返回0 if fresh_count == 0: return 0 # 初始化分钟数 minutes = 0 # 开始进行BFS,直到队列为空 while queue: # 记录当前分钟数下,队列中的元素数量 size = len(queue) # 遍历当前分钟数下的所有腐烂的橘子 for _ in range(size): x, y = queue.popleft() # 遍历四个方向 for dx, dy in directions: nx, ny = x + dx, y + dy # 判断新位置是否在网格内,并且是新鲜橘子 if 0 <= nx < row and 0 <= ny < col and grid[nx][ny] == 1: # 将新鲜橘子变为腐烂状态 grid[nx][ny] = 2 # 将新鲜橘子的位置加入队列 queue.append((nx, ny)) # 新鲜橘子的数量减1 fresh_count -= 1 # 如果当前分钟数下,没有新鲜橘子了,结束循环 if fresh_count == 0: break # 每遍历完一层,分钟数加1 minutes += 1 # 如果最后还有新鲜橘子,返回-1,否则返回分钟数 return -1 if fresh_count > 0 else minutes ``` 你可以将给定的网格作为参数传递给`orangesRotting`函数来测试它。请注意,该代码使用了BFS算法来遍历橘子,并计算腐烂的分钟数。希望能对你有所帮助!如果有任何疑问,请随时问我。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值