力扣:删除倒数第n个结点

文章目录
思路
双指针,首先让快指针先走n个点.这时候和slow的距离便是从最后一个点到要删的点的距离
解题方法
定义一个fast指针,和一个slow指针,指向dummyhead(虚头结点,便于统一操作), 首先让快指针先走n个点.这时候和slow的距离便是从最后一个点到要删的点的距离
复杂度
- 时间复杂度:
- O ( n )
- 空间复杂度:
- O ( 1 )
Code
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummyHead = new ListNode(0);
dummyHead.next = head;
ListNode fastIndex = dummyHead;
ListNode slowIndex = dummyHead;
n++; //让fast指针多走一步,从而让slow->next指向被删的点
while(n-- != 0&& fastIndex!=null){
fastIndex = fastIndex.next;
}
while(fastIndex != null){
slowIndex = slowIndex.next;
fastIndex = fastIndex.next;
}
slowIndex.next = slowIndex.next.next;
return dummyHead.next;
}
}
Code
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* dummyHead = new ListNode(0);
dummyHead->next = head;
ListNode* fast = dummyHead; // 快指针
ListNode* slow = dummyHead;
n++; //因为要操作的是slow->next,同时也为了避免fast为空指针的情况
while(n-- && fast != NULL){
fast = fast->next;
}
while(fast != NULL){
fast = fast->next;
slow = slow->next;
}
slow->next = slow->next->next;
return dummyHead->next;
}
};