19. Remove Nth Node From End of List
题解:
本题主要思路时一直关注倒数第n个,从指针 1 遍历开始就计算 head 是倒数第几个,当 head 是倒数第 n 个时就用指针 2 开始记录第 n 个的位置,指针 1 和 2 同时变化,则指针 2 一直指向倒数第 n 个节点,则当直到指针 1 遍历全部链表,则指针 2 位置为倒数第 n 个。具体细节见代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
if(n == 0){
return head;
}
ListNode *ptr, *prep; // 指向当前节点
ListNode *nth, *prepNth; // 指向倒数第n个节点
int num = 0;
prep = head, ptr = head->next, num++; //初始化当前指针
nth = prepNth = NULL;
if(num == n){
nth = head;
// 针对 n = 1 情况
// 初始化nth指针,当 num == n 时,说明已经走过 n 个节点,令nth指向head;
}
while(ptr != NULL){
if(nth != NULL){
// 指针移动
prepNth = nth;
nth = nth->next;
}
prep = ptr;
ptr = ptr->next;
num++;
if(num == n){
nth = head;
// 针对 n > 1 情况
}
}
if(nth == NULL){
return head; // 当倒数第 n 个不存在
}
else if(nth == head){
return head->next; // 当倒数第 n 为第一个
}
// 其余情况
prepNth->next = nth->next;
nth->next = NULL;
//free(nth);
return head;
}
};
RememberUrHeart 发布了37 篇原创文章 · 获赞 7 · 访问量 6101 私信 关注