LeetCode 之 Remove Nth Node From End of List

原题:

Given a linked list, remove the nth node from the end of list and return its head.

这个题是要求把链表的倒数第N个元素删除。。。当然只能扫描一次,其实很简单,用队列就可以,比如要删第i个,非常好,我这个队列就保存i个,没遇到一个节点我就把整个队列向前移一步,那么最后队列的头部就是这个要删除的节点喽。。。这个题关键是需要对一些特殊情况进行考虑,主要是边界问题,思路如下:

1:由于需要将第n个元素删去,因此队列的大小需要是n+1,在循环中,当队列大于n时,把头pop出去,再push进来一个,保证队列大小为n+1(如删除第一个元素时,队列大小是2),这样直接把队头指向next->next就可以了,如图1

                                                      

图1

2:有这么几种情况,

       1)链表只有一个元素,删除第一个,那么队列的大小只能是1,此时把head指向NULL

        2)要删除链表的第一个元素,由于头部之前没有元素,直接把head指向next

上面两种情况都是删除链表的头只需要判断队列的大小是否等于n就可以了,然后把head指向next

如图2

    

图2

代码如下: (36 ms)

class Solution {
public:
    ListNode *removeNthFromEnd(ListNode *head, int n) {
        // IMPORTANT: Please reset any member data you declared, as
        // the same Solution instance will be reused for each test case.
        
        queue<ListNode*>q;
        ListNode* tail = head;
        while(tail!=NULL){
            //当队列的大于n,即从n+1开始pop
            if(q.size()>n){
                q.pop();
            }
            q.push(tail);
            tail=tail->next;
        }
        //如果队列大小为n,说明要删除头结点,直接next就可以
        if(q.size() == n){
            head = head->next;
        }
        else{
            q.front()->next = q.front()->next->next;
        }
        
            return head;
    }
};



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值