一.删除链表的第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,若为零则返回数组的长度.