给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
输入: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来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
int getLength(struct ListNode* head) {
int length = 0;
while (head) {
++length;
head = head->next;
}
return length;
//这个求得是这个链表的长度。
}
struct ListNode* removeNthFromEnd(struct ListNode* head,int n){
//dummy是用来保证头指针的,返回链表的头指针,就是返回整个链表
struct ListNode* dummy = malloc(sizeof(struct ListNode));
dummy->val=0,dummy->next=head;
//获取原链表的长度,调用了上面的方法
int length = getLength(head);
//创建一个用来遍历链表的指针
struct ListNode* cur = dummy;
//查找倒数第n个结点
for(int i=1;i<length-n+1;++i){
cur=cur->next;
}
//将倒数第n个结点删除
cur->next = cur->next->next;
struct ListNode* ans = dummy->next;
free(dummy);
//return head;
return ans;
}
我现在没有搞清楚的是
struct ListNode* ans = dummy->next;
free(dummy);
//return head;return ans;
dummy->next本身就等于head,为什么不直接return head,还要让另一个指针等于dummy->next再return出来呢?
不客气地说,这个题确实难亿点。。通过做这个题,我最大的收获不是会了这道题,而是我搞清楚了struct ListNode。
struct ListNode {
int val; //定义val变量值,存储节点值
struct ListNode *next; //定义next指针,指向下一个节点,维持节点连接
}
- 在节点ListNode定义中,定义为节点为结构变量。
- 节点存储了两个变量:value 和 next。value 是这个节点的值,next 是指向下一节点的指针,当 next 为空指针时,这个节点是链表的最后一个节点。
- 注意注意val只代表当前指针的值,比如p->val表示p指针的指向的值;而p->next表示链表下一个节点,也是一个指针。
- 构造函数包含两个参数 _value 和 _next ,分别用来给节点赋值和指定下一节点
ok!今天的算法题结束!!!