- 题目:给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
进阶:你能尝试使用一趟扫描实现吗?
2. 解题思路:
我采用的是双指针的方式,两个指针之间相隔n-1个元素,当后面的那个结点的next域为空的时候,此时p结点指向倒数第n个结点的前一个结点,直接进行删除,要注意的是链表有n个结点而要删除倒数第n个结点的情况(解决方法见代码)。
- 代码:
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
//使用相隔n个结点的双指针来进行删除
ListNode *p = head,*q = head;
for(int i = 0;i < n ;i++){
q = q->next;
}
//链表有n个元素,删除倒数第n个元素的情况。
if(q == nullptr){
head = head->next;
return head;
}
while(q->next != nullptr){
p = p->next;
q = q->next;
}
p->next = p->next->next;
return head;
}
};
- tips:无。