题目:给你一个链表,删除链表的倒数第n个结点,并返回链表的头结点
思路:删除倒数第n个结点(从后往前数第n个 )可以转化成删除第len-n+1个(从前往后数 len为链表的长度)
- 第一步求出链表长度
- 找到要删除的结点的前一个结点
- 使要删除的前一个结点的指针向要删除结点的指针指向 即 p->next=p->next->next
特殊说明:防止要删除的结点为第一个结点 找不到第一个结点的前驱结点,我们自己开辟一个新结点使新结点指向第一个结点。这样第一个结点就有前驱结点了,同时也适用于上述步骤方法了。
struct ListNode* dummy = malloc(sizeof(struct ListNode));
dummy->val = 0, dummy->next = head;
代码如下:
时间复杂度为(O(n)) 空间复杂度为(O(1))
int getLength(struct ListNode* head) { //求链表长度
int length = 0;
while (head) {
length++;
head = head->next;
}
return length;
}
struct ListNode* removeNthFromEnd(struct ListNode* head, int n) {
struct ListNode* dummy = malloc(sizeof(struct ListNode));
dummy->val = 0, dummy->next = head;
int length = getLength(head);
struct ListNode* cur = dummy; //保留dummy指针指向 以便返回头结点
for (int i = 1; i < length - n + 1; ++i) {
cur = cur->next;
}
cur->next = cur->next->next;
struct ListNode* p = dummy->next;
return p;
}