leetcode日记(9)删除链表的倒数第n个节点

leetcode日记(9)删除链表的倒数第n个节点_第1张图片

说来惭愧…这道题我一开始的思路是一一遍历链表节点,然后建立bool函数挨个判断……后来发现根本不行,报错而且时间复杂度还贼大。

于是就用了下面两种不同的方法——

思路1是先将链表的结点数算出来,创建ListNode* node=head用遍历的方式得到链表节点数,然后将节点数减去n,由题目给的倒数第n位得到正数第几位,然后遍历到该节点的前一位,再用node->next=node->next->next即可删除node->next节点。

值得一提的是写到这里我还卡了一下,系统老是报下面这个错误,去搜了一下发现是因为n->next节点不存在。

做到这里我有些纳闷了,为什么会导致这样的错误,后来看了一眼答案,发现答案新定义了一个节点ListNode* dummy=new ListNode(0,head),意为在head前还设置了一个节点。

这里我思考了好久才终于明白原因,如果数据例子中链表只有一个节点,而n=1,那么就会出现上面那个错误,遍历了0次,指针node指向head,head->next节点本来就不存在,那么更不会有head->next->next节点,所以系统就会报上面的错误。如果定义了dummy节点,正好删除的就是head,head->next==NULL,所以就不会报错。

/**
 * 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* dummy = new ListNode(0, head);
        ListNode* node=dummy;
        ListNode* no=node;
        int l=getlength(head);
        for(int i=1;inext;
        node->next=node->next->next;
        ListNode* ans=dummy->next;
        return ans;
    }
    int getlength(ListNode* no){
        int l=0;
        while(no){l++;no=no->next;}
        return l;
    }
};

思路2是利用堆栈,众所周知栈是先进后出,那么我们可以先将链表全部压入栈内,然后踢出n个节点,此时栈顶便是我们要找到需要删除的前一个节点。

(这个方法是看答案知道的,在看答案之前我还不清楚堆栈的用法,也算是学到新东西了)

建立stack:

stacks;

stack的一些用法:

s.empty() //判断堆栈是否为空
s.pop() //弹出堆栈顶部的元素
s.push() //向堆栈顶部添加元素
s.size() //返回堆栈中元素的个数
s.top() //返回堆栈顶部的元素 

/**
 * 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* dummy=new ListNode(0,head);
        stack stk;
        ListNode* cur=dummy;
        while(cur){
            stk.push(cur);
            cur=cur->next;
        }
        for(int i=0;inext=top->next->next;
        ListNode* x=dummy->next;
        return x;
    }
};

你可能感兴趣的:(leetcode,链表,算法)