每日一题,每日一练。8 .链表的中间结点

876. 链表的中间结点

.
给定一个带有头结点 head 的非空单链表,返回链表的中间结点。

如果有两个中间结点,则返回第二个中间结点

示例 1:

输入:[1,2,3,4,5] 输出:此列表中的结点 3 (序列化形式:[3,4,5]) 返回的结点值为 3 。
(测评系统对该结点序列化表述是 [3,4,5])。 注意,我们返回了一个 ListNode 类型的对象 ans,这样: ans.val =
3, ans.next.val = 4, ans.next.next.val = 5, 以及 ans.next.next.next = NULL.

示例 2:

输入:[1,2,3,4,5,6] 输出:此列表中的结点 4 (序列化形式:[4,5,6]) 由于该列表有两个中间结点,值分别为 3 和
4,我们返回第二个结点

一道非常简单的链表题(有点过于简单了,,)开始的时候想的是先遍历一遍链表,得到链表的长度从而得到中值位置,然后再遍历到中止就可以了

代码如下:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def middleNode(self, head: ListNode) -> ListNode:
        c=head
        count=1
        half=1
        while(c.next!=None):
            c=c.next
            count=count+1
        count=(count)//2+1
        c=head
        while(half!=count):
            c=c.next
            half=half+1
        return c

后来改进的时候发现在第一遍遍历是可以用一个顺序表存进去,这样每个节点和他的位置就是一一对应的关系,不用第二次遍历就能提取中值了,不过这种方法要注意特殊值
代码如下:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def middleNode(self, head: ListNode) -> ListNode:
        a=[]
        if(head.next==None):
            return head
        while(head!=None):
            a.append(head)
            head=head.next
        return a[(len(a))//2]

一道轻松的小题开启了繁忙的一天~

发布了10 篇原创文章 · 获赞 0 · 访问量 89

猜你喜欢

转载自blog.csdn.net/final_begin/article/details/105041255