leetcode19_删除链表的倒数第N个节点

一、题目

 

 

二、分析

   我最开始的想法是,先记录链表长度,然后确定对应节点的序号,然后删除,需要删除两个部分,空间复杂度为O(1),时间复杂度为O(2*n);

  代码如下,需要注意如果删除节点出门在头节点的情况。

/**
 * 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) {
        if(head == NULL) return head;
        int size = 0;
        ListNode* pre = head;
        while( pre != NULL){
            size++;
            pre = pre->next;
        }
        //查找对应元素,然后删除
        int count = size - n;
        pre = head;
        if(count == 0){
            return head->next;
        }
        size = 0;
        while(pre!=NULL){
            count--;
            if(count==0){
                ListNode* lat = pre->next;
                pre->next = lat->next;
                break;
            }
            pre = pre->next;
        }
        return head;
    }
};

三、实例代码

   例子想法只使用了一次遍历就完成了整个过程,使用了双节点

 

 

class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
     ListNode* dummyHead = new ListNode(0);
        dummyHead->next = head;

        ListNode* p = dummyHead;
        ListNode* q = dummyHead;
        for( int i = 0 ; i < n + 1 ; i ++ ){
            q = q->next;
        }

        while(q){
            p = p->next;
            q = q->next;
        }

        ListNode* delNode = p->next;
        p->next = delNode->next;
        delete delNode;

        ListNode* retNode = dummyHead->next;
        delete dummyHead;

        return retNode;
        
    }
};

 

posted @ 2021-11-10 23:32  星光夜  阅读(31)  评论(0)    收藏  举报