leetcode 19. Remove Nth Node From End of List

这道题我就是用一个节点把链表遍历,一个节点保存之前的节点,当遇到想删的节点的时候删除之后,删除节点的下一个节点连接到之前保存的节点。

/**
 * 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) {
        int head_lens = 1;

        if(!head || !head->next)
            return NULL;

        ListNode *tmp = head;
        ListNode *pre_node = NULL;

        while(tmp !=NULL)
        {
            head_lens++;
            tmp = tmp->next;
        }

        head_lens -= n;

        tmp = head;
        ListNode *tmp_remove = NULL;
        while(tmp !=NULL)
        {
            head_lens--; 

            if(head_lens == 0)
            {
                if(tmp == head)
                    return head->next;

                pre_node->next = tmp->next;    
                tmp_remove = tmp;
                if(tmp_remove)
                    delete tmp_remove;
                return head;
            }    

            pre_node = tmp;
            tmp = tmp->next;           
        }

        return head;
    }
};

还有一个是top solution,写得真好呀!非常优雅。非常佩服,希望有一天我也可以写出这么好的代码。它的思想就是比如1,3,2,4,6,5,这样的数组。比如要删除n=2,指针a先跳到第二个节点,然后开始和另外一个新的节点b一起行动,等a结束之后,b也到了它要去的地方。完美~

然后但是我发现时间上它并没有比我好,和我一样。

class Solution
{
public:
    ListNode* removeNthFromEnd(ListNode* head, int n)
    {
        ListNode** t1 = &head, *t2 = head;
        for(int i = 1; i < n; ++i)
        {
            t2 = t2->next;
        }
        while(t2->next != NULL)
        {
            t1 = &((*t1)->next);
            t2 = t2->next;
        }
        *t1 = (*t1)->next;
        return head;
    }
};
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值