删除链表中的倒数第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]
直接法
struct ListNode* removeNthFromEnd(struct ListNode* head, int n){
if(head == NULL)
{
return NULL;
}
//计算链表长度
struct ListNode *p = head;
int length = 0;
while(p != NULL)
{
length ++;
p = p->next;
}
p = head;
//删除头节点返回,length和n相等
if (length == n) {
head = head->next;
return head;
}
int targetNode = length - n;
for(int i = 0; i < targetNode-1;i ++)
{
p = p -> next;
}
p->next = p->next->next;
return head;
}
双指针
struct ListNode* removeNthFromEnd(struct ListNode* head, int n){
struct ListNode *p = head, *q = head;
while(p){
if(n < 0){ q = q -> next; }
n--;
p = p -> next;
}
if(n == 0){ return head -> next; }
q -> next = q -> next -> next;
return head;
}