题目内容
给你一个链表,删除链表的倒数第 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
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list
c语言解答
/**
*思路 双指针,以个指针先走k步 然后俩指针开始同时走,最后那个走的指针就是要删除指针的前一个
*
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* removeNthFromEnd(struct ListNode* head, int n){
//如果给的head下一个就是空的话,那删除的肯定是当前结点,直接返回空就行
if(head->next==NULL){
return NULL;
}
//记录遍历的指针zou
struct ListNode*zou=head;
//记录倒数第n个节点前那个节点的指针p
struct ListNode*p=head;
//计数
int count=0;
while(zou!=NULL){
//光zou指针走的时候
if(count<=n){
count++;
}
//两指针开始同步走
else{
//count++;
p=p->next;
}
zou=zou->next;
}
// if(p->next==NULL){
// return head; 这个不用考虑,因为前面开头已经考虑过了,只要zou指针能往下走后,p->next一定不会空
// }
//考虑删除的结点是头结点,namenamewhile循环中 else 是没有执行到
if(count==n){
return head->next;
}
//正常情况下,删除倒数第n个节点,通过让前一个指针指向他的后一个指针来实现
p->next=p->next->next;
return head;
}
java解答
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
//如果给的head下一个就是空的话,那删除的肯定是当前结点,直接返回空就行
if(head.next==null){
return null;
}
//记录遍历的指针zou
ListNode zou=head;
//记录倒数第n个节点前那个节点的指针p
ListNode p=head;
//计数
int count=0;
while(zou!=null){
//光zou指针走的时候
if(count<=n){
count++;
}
//两指针开始同步走
else{
// count++;
p=p.next;
}
zou=zou.next;
}
//考虑删除的结点是头结点,namenamewhile循环中 else 是没有执行到
if(count==n){
return head.next;
}
//正常情况下,删除倒数第n个节点,通过让前一个指针指向他的后一个指针来实现
p.next=p.next.next;
return head;
}
}