给你一个链表,删除链表的倒数第 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]
这个题我读完之后立马想到就是先遍历一遍链表统计节点个数,最后通过n的判断找到倒数第N的前驱节点进行删除,通过了,但是想到了几天前那个 876 删除中间节点那个可以使用双指针来操作,但是如果这个不加一个头节点的话就要对很多情况进行判断,所以我们选择加上头结点进行解题。
struct ListNode* removeNthFromEnd(struct ListNode* head, int n){
assert(head);
struct ListNode* HeadNode = (struct ListNode*)malloc(sizeof(struct ListNode));
HeadNode->val = 0;
HeadNode->next = head;
struct ListNode* fast = head;
struct ListNode* slow = HeadNode;
for (int i = 0;i < n;i++){
fast = fast->next;
}
while(fast != NULL){
fast = fast->next;
slow = slow->next;
}
slow->next = slow->next->next;
struct ListNode* ret = HeadNode->next;
free(HeadNode);
return ret;
}