876.链表的中间结点

第一次尝试

  给定一个头结点为 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。链表为无头结点、单向、不循环。(由于涉及到结构体,所以写不了完整的测试代码,下面展示的代码为 LeetCode 中写的代码)(LeetCode链接)

  • 方法一:做两次循环,第一次计数有多少个节点,记为 count;第二次循环获取到第 count/2 + 1 个节点的数据;
  • 方法二:快慢指针,设置两个指针 fast、slow,初始时都指向首节点,然后 fast 每次走两步,slow 每次走一步,当 fast 走到链表结尾,slow 正好指向中间的节点,这样一次循环就可以做到;
struct ListNode* middleNode(struct ListNode* head){
    //常规做法,两次循环
    if(head->next == NULL){
        return head;
    }
    struct ListNode* node = head;
    //第一次循环计数count
    int count = 0;
    while(node){
        node = node->next;
        count++;
    }
    //找到中间位置
    count = count/2 + 1;
    while(count > 1){
        head = head->next;
        count--;
    }
    return head;

    //快慢指针法
    struct ListNode* fast = head;
    struct ListNode* slow = head;
    while(fast != NULL&&fast->next != NULL){
        //快指针一次走两步,慢指针一次走一步
        slow = slow->next;
        fast = fast->next->next;
    }
    return slow;
}

博客园发表于 2020-12-11 14:43

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值