LeetCode 019. Remove Nth Node From End of List

Remove Nth Node From End of List

 

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

For example,

   Given linked list: 1->2->3->4->5, and n = 2.

   After removing the second node from the end, the linked list becomes 1->2->3->5.

Note:
Given n will always be valid.
Try to do this in one pass.

这道题要求删除链表倒数第n个节点。思路就是用两个指针,第一个指针先遍历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 *fore = head;
        ListNode *rear = head;
        ListNode *temp;
        int i = 0;
        while(i < n)
        {
            i++;
            fore = fore->next;
        }
        if(!fore)
        {
            temp = head;
            head = head->next;
            delete temp;
            return head;
        }
        while(fore->next) 
        {
            fore = fore->next;
            rear = rear->next;
        }

        //rear处于待删除节点的前一个节点
        temp = rear->next;
        rear->next = rear->next->next;
        delete temp;
        return head;
    }
};

第二种是认为在链表前再加上一个头结点,等处理完毕后再删掉该人为添加的头结点。

/**
 * 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) 
    {
        //为了避免出现删除头结点的麻烦问题,我就在head前面再加上一个节点。
        ListNode *temp = new ListNode(0);
        temp->next = head;
        head = temp;
        ListNode *fore = head;
        ListNode *rear = head;
        int i = 0;
        while(i < n)
        {
            i++;
            fore = fore->next;
        }
        while(fore->next) 
        {
            fore = fore->next;
            rear = rear->next;
        }
        //rear处于待删除节点的前一个节点
        temp = rear->next;
        rear->next = rear->next->next;
        delete temp;
        //前面添加了头结点,现在必须将头结点删除
        temp = head;
        head = head->next;
        delete temp;
        return head;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值