1、题目:删除链表的倒数第N个节点
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
2、解题思路
方法一:双指针
因为要取得的数据是倒数第几个数据,所以如果直接从前往后遍历取得他的长度的话,需要遍历两边,所以如果我们采用双指针,把快指针快于慢指针 n 个位置的话,就可以当快指针遍历结束时,直接取出慢指针的数据即是倒数第 n 个数据。
方法二:栈
这种倒数第几个数据的题目,都可以用栈的方法来解决,把所有的数据入栈之后,pop出 n 个数据就是倒数第 n 个数了。
3、代码
//方法一 双指针
class Solution
{
public:
ListNode* removeNthFromEnd(ListNode* head, int n)
{
ListNode* dummyHead = new ListNode(0);
dummyHead->next = head;
ListNode* slow = dummyHead;
ListNode* fast = dummyHead;
for (int i = 0; i < n; i++)
{
fast = fast->next;
}
while(fast->next != nullptr)
{
fast = fast->next;
slow = slow->next;
}
slow->next = slow->next->next;
return dummyHead->next;
}
};
//方法二
class Solution
{
public:
ListNode* removeNthFromEnd(ListNode* head, int n)
{
ListNode* dummy = new ListNode(0, head);
stack<ListNode*> stk;
ListNode* cur = dummy;
while (cur)
{
stk.push(cur);
cur = cur->next;
}
for (int i = 0; i < n; ++i)
{
stk.pop();
}
ListNode* prev = stk.top();
prev->next = prev->next->next;
ListNode* ans = dummy->next;
delete dummy;
return ans;
}
};