链表我还有点薄弱,这题虽然是中等题,但是我还是参考别人的。
https://blog.csdn.net/qq_39241239/article/details/82319620
C语言版本,写的挺通俗易懂的
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* removeNthFromEnd(struct ListNode* head, int n) {
//如果链表结点个数为0,直接返回
if(n==0){
return head;
}
//fastp为快指针,slowp为慢指针(用于指向待删除结点),slowq指向待删除结点的前驱结点。
struct ListNode *fastp=NULL,*slowp=NULL,*slowq=NULL;
//先让快指针后跑n个结点
for(fastp=head;n>0;fastp=fastp->next,n--);
slowp=head;
//然后让快指针和慢指针一起向后跑,slowp为slowq的联动指针
//当快指针跑到NULL时停止,这时候快指针一定指向待删除结点
while(fastp){
slowq=slowp;
slowp=slowp->next;
fastp=fastp->next;
}
//如果要删除的结点为头结点,需要单独处理。否则,利用slowq->next=slowp->next即可删除结点
if(slowp==head){
head=head->next;
}else{
slowq->next=slowp->next;
free(slowp);
}
return head;
}
C++版本
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
if(!head) return NULL;
ListNode *p = head;
while(n!=0 && p->next!= NULL) {
p = p -> next;
n--;
}
// if(n>1) return head;
if(n==1) return head->next;
ListNode *p2 = head;
while(p->next) {
p = p->next;
p2 = p2->next;
}
p2->next = p2->next->next;
return head;
}
};
代码还是多练习才有进步。