LeetCode---删除链表的第n个结点&&最后一个单词的长度

本文介绍了如何在给定链表中删除倒数第n个节点的C++代码实现,以及如何计算字符串中最后一个单词长度的算法。这两个问题都涉及到数据结构和字符串处理技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.删除链表的第n个结点

题目描述:

给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

示例 1:

输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]

示例 2:

输入:head = [1], n = 1
输出:[]

示例 3:

输入:head = [1,2], n = 1
输出:[1]

提示:

  • 链表中结点的数目为 sz
  • 1 <= sz <= 30
  • 0 <= Node.val <= 100
  • 1 <= n <= sz

代码实现:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* removeNthFromEnd(struct ListNode* head, int n) {
    struct ListNode*p,*q,*s;
    p=(struct ListNode*)malloc(sizeof(struct ListNode));
    p->next=head;
    if(head->next==NULL)
    {
        p=NULL;
        return p;
    }
    q=head;
    s=p;
    int i=0,j=0;
    while(q)
    {
        q=q->next;
        i++;
    }
    while(p->next)
    {
        if(i-j==n)
        {
            p->next=p->next->next;
            return s->next;
        }
        j++;
         p=p->next;
    }
    return head;
}

解题思路:

首先创建两个整型变量i,j遍历两次链表,第一次计算链表的节点数目i,第二次在遍历过程中计算当前的结点数j,用i-j也就是当前结点的倒数数了,如果当前i-j与n相等,说明该节点为符合题目要求的结点,但需要注意的是,由于删除链表节点的操作为将当前结点的上一个结点指向当前结点的下一个结点你,所有我们应提前建立一个虚拟结点,特判删除的结点为第一个结点的特殊情况.

二.最后一个单词的长度

题目描述:

给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。

单词 是指仅由字母组成、不包含任何空格字符的最大

子字符串

示例 1:

输入:s = "Hello World"
输出:5
解释:最后一个单词是“World”,长度为5。

示例 2:

输入:s = "   fly me   to   the moon  "
输出:4
解释:最后一个单词是“moon”,长度为4。

示例 3:

输入:s = "luffy is still joyboy"
输出:6
解释:最后一个单词是长度为6的“joyboy”。

提示:

  • 1 <= s.length <= 104
  • s 仅有英文字母和空格 ' ' 组成
  • s 中至少存在一个单词

代码实现:

int lengthOfLastWord(char* s) {
    int len=strlen(s);
    while(s[len-1]==' ')
    {
        len--;
    }
    for(int i=len-1;i>=0;i--)
    {
        if(s[i]==' ')
        {
            return len-1-i;
        }
        else if(i==0)
        {
            return len;
        }
    }
    return 0;
}

解题思路:

首先求出数组的长度len,然后从数组最后一位开始判断当前字符是否为空格,若为空格则令长度len减一,以便在下一循环中求出最后一个字符串的长度

在第二个循环中,从经过变化后的数组长度len(也就是减去数组最后面空格长度)的位置开始从后向前遍历数组,当第一次遇到空格时,返回数组最后的下标减去当前的下标,也就是最后一个字符串的长度,当然,如果数组中只有一个字符串时,在第二个循环遍历中不会遇到空格,我们可以在循环中同时判断此时数组的下标是否为0,若为零则返回数组的长度.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值