因为是单链表结构,没有办法逆向遍历,先要从头到尾遍历一遍,计算出整个链表的长度,然后就可以计算出倒数第N个节点,对应正数的方式是第几个节点。最后再找到这个节点删除即可。但是,还有一种思路,就是利用两个节点指针指向头节点,先将其中一个节点指针向后移动N个节点,然后两个节点指针同时向后移动,当其中一个节点指针移动到末尾的时候,另一个节点指针指向的节点就是倒数第N个节点,将它删除即可。
下面是第二种思路实现的C语言代码。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* removeNthFromEnd(struct ListNode* head, int n){
if (head == NULL) {
return NULL;
}
struct ListNode* p = head;
struct ListNode* q = head->next;
while (n--) {
if (q == NULL) {
return p->next;
}
q = q->next;
}
while (q != NULL) {
p = p->next;
q = q->next;
}
p->next = p->next->next;
return head;
}