题目描述
删除链表中倒数第n个结点,并返回头结点指针
题目解析
- 先遍历一遍,获取链表长度length,然后再从头遍历length-n步,获取要删除结点的前继结点,进行删除即可。
ListNode *RemoveNthNodeFromLink1(ListNode*head,int n)
{
if(head == nullptr) return nullptr;
ListNode * virtual_node = new ListNode();
virtual_node->next = head;
//获取链表的总长度
ListNode *cur = virtual_node;
int length = 0;
while(cur != nullptr)
{
++length;
cur = cur->next;
}
//获取要删除结点的前一个结点,遍历len - n
int count = length - n;
ListNode *pre = virtual_node;
while (count > 0)
{
pre = pre->next;
}
//删除结点
ListNode *tmp = pre->next;
pre->next = tmp->next;
tmp->next = nullptr;
return virtual_node->next;
}
- 使用快慢指针,fast先走n+1步,保证slow和fast之间有n个结点,然后两个一起每次走一步,直到fast为Null,此时slow指向要删除结点的前一个结点,然后进行删除
ListNode *RemoveNthNodeFromLink2(ListNode*head,int n)
{
if(head == nullptr) return nullptr;
ListNode * virtual_node = new ListNode();
virtual_node->next = head;
ListNode * fast = virtual_node;
ListNode * slow = virtual_node;
int step = n +1;
while(n >= 0)
{
fast = fast->next;
--n;
}
while(fast!=nullptr)
{
fast = fast->next;
slow = slow->next;
}
ListNode *tmp = slow->next;
slow->next = tmp->next;
tmp->next = nullptr;
return virtual_node->next;
}