一、题目
二、思路
使用双指针法,指针pre指向新创建的头结点,p初始指向链表原首结点,先让p向后走n-1步,这时pre和p之间相隔n个结点,然后pre和 p 同步后移,当p指向链尾结点时,pre指向的是被删除结点的前驱结点,最后删除结点即可。
三、代码
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* dummy = new ListNode(-1);
dummy->next = head;
ListNode* pre = dummy;
ListNode* p = head;
for(int i=1; i<n; i++){ //p向后走n-1步
p = p->next;
}
while(p->next){
p = p->next; //p最终指向链表最后一个节点
pre = pre->next; //pre最终指向被删结点的前驱结点
}
pre->next = pre->next->next;
return dummy->next;
}
};
四、运行结果