首页 > 试题广场 >

链表的中间结点

[编程题]链表的中间结点
  • 热度指数:1736 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个头结点为head的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。
结点数量介于 1100 之间。
示例1

输入

{1,2,3}

输出

{2,3}

说明

此列表中的中间为结点 2 ,测评系统对该结点序列化表述是 {2,3} 
示例2

输入

{1,2,3,4}

输出

{3,4}

说明

此列表中的中间为结点 3 ,测评系统对该结点序列化表述是 {3,4} 

说明:本题目包含复杂数据结构ListNode,点此查看相关信息
另类解法,
struct ListNode* middleNode(struct ListNode* head ) 
{
    struct ListNode *dummy = (struct ListNode*)malloc(sizeof(struct ListNode));
    dummy->next = head;
    struct ListNode *p = dummy;
    struct ListNode *cur = dummy;
    int sz = 0;

    while(p->next)
    {
        sz++;
        p = p->next;
    }

    int mid = (sz / 2) + 1 ;

    for(int i=0;i<mid;i++)
    {
        cur = cur->next;
    }

    dummy->next = cur;
    return dummy->next;
}

不采用快慢指针,先求出链表的长度,除以2在+1就可以求出中间值,中间值前面的抛弃即可。
发表于 2023-04-13 00:23:05 回复(0)
package main
//import "fmt"
import . "nc_tools"
/*
 * type ListNode struct{
 *   Val int
 *   Next *ListNode
 * }
 */

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param head ListNode类 
 * @return ListNode类
*/
func middleNode( head *ListNode ) *ListNode {
    arr:=[]*ListNode{}
    for p:=head;p!=nil;p=p.Next{
        arr=append(arr,p)
    }
    return arr[len(arr)/2]
}

发表于 2023-03-09 08:41:04 回复(0)
   public ListNode middleNode (ListNode head) {
        // write code here
        List<ListNode> list = new ArrayList<>();
        // 设置2个记录指针
        ListNode fast = head;
        ListNode slow = head;
        while(fast != null && fast.next!=null){
           fast =  fast.next.next;
           slow = slow.next;
        }
        return slow;

    }
发表于 2023-02-11 17:05:13 回复(0)
struct ListNode* middleNode(struct ListNode* head ) 
{
    // write code here
    struct ListNode* fast=head;
    struct ListNode* slow=head;
    while(fast&&fast->next)
    {
        slow = slow->next;
        fast = fast->next->next;
    }
    return slow;
}

发表于 2022-04-19 16:56:56 回复(0)

问题信息

难度:
4条回答 2131浏览

热门推荐

通过挑战的用户

查看代码