题目描述
给定一个链表,删除链表的倒数第 n 个节点并返回链表的头指针
例如,
给出的链表为: 1→2→3→4→5, n= 2.
删除了链表的倒数第 n 个节点之后,链表变为1→2→3→5.
解法
解法一、先获取链表的长度,然后计算在n结点前还有几个结点,让指针走到n结点的前一个结点,再删除n结点即可
注意,对于头结点的删除,要单独处理
class Solution {
public:
/**
*
* @param head ListNode类
* @param n int整型
* @return ListNode类
*/
ListNode* removeNthFromEnd(ListNode* head, int n) {
// write code here
if(n == 0) return head;
ListNode * p = head;
int i = 0;
while(p != NULL)
{
i++;
p = p->next;
}
//如果要删除第一个结点
if(n == i)
{
ListNode * s;
s = head;
head = head->next;
free(s);
return head;
}
int j = i - n;
i = 1;
p = head;
while(i < j)
{
i++;
p = p->next;
}
ListNode * s = p->next;
p->next = p->next->next;
free(s);
return head;
}
};
时间复杂度O(n)
空间复杂度O(1)
解法二、定义快慢指针,快指针先走n步,然后快慢指针一起走,快指针走到空的时候慢指针正好在倒数第n个结点上。
class Solution {
public:
/**
*
* @param head ListNode类
* @param n int整型
* @return ListNode类
*/
ListNode* removeNthFromEnd(ListNode* head, int n) {
// write code here
if(n == 0) return head;
ListNode * fast = head;
ListNode * slow = head;
int i = 0;
for(i; i < n; i++)
{
fast = fast->next;
}
//删除第一个结点
if(fast == NULL)
{
ListNode * s = head;
head = head->next;
free(s);
return head;
}
while(fast->next != NULL)
{
slow = slow->next;
fast = fast->next;
}
ListNode * s = slow->next;
slow->next = s->next;
free(s);
return head;
}
};
时间复杂度O(n)
空间复杂度O(1)