【leetcode 19】C++链表操作1:删除倒数第n个节点

题目:删除倒数第n个节点,最后的返回为head

这里写图片描述

解题思路:

想在一次遍历的情况下对相应的节点进行删除,可以考虑两个指针,两个指针的距离恰好为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) {
        ListNode *pre = new ListNode(0);
        pre->next = head;
        ListNode *p = pre;
        ListNode *q = pre;

        for(int i = 0; i < n; i++) {
            p = p->next;
        }
        while(p->next != NULL) {
            p = p->next;
            q = q->next;
        }

        ListNode *k = q->next;
        if(k == head) {
            head = head->next;
            delete k;
            return head;
        }
        q->next = k->next;
        delete k; 

        return head;
    }
};

知识点:
1、删除一个节点的关键是找到该节点的前向节点
2、头节点没有前向节点,就人为的添加一个前向的节点,这样可以使处理所有的情况实现统一,而不用因处理特殊情况引入复杂的开销。

猜你喜欢

转载自blog.csdn.net/u013108511/article/details/80404476
今日推荐