关闭

LeetCode第19题之 Remove Nth Node From End of List

标签: leetcode
146人阅读 评论(0) 收藏 举报
分类:

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.

#include <iostream>
#include <vector>
using namespace std;


struct ListNode {
     int val;
     ListNode *next;
     ListNode(int x) : val(x), next(NULL) {}
};

class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        //如果为空链表
        if (NULL == head)
        {
            return head;
        }
        //如果链表只有一个节点,且n为1
        if (NULL == head->next && 1 == n)
        {
            delete head;
            return NULL;
        }
        ListNode * ptr = head;
        --n;
        while (n>0 && ptr)
        {   
            ptr = ptr->next;
            --n;
        }
        //ptr不为NULL,则存在第n个节点,且此时ptr指向第n个节点
        if (ptr != NULL)
        {
            //这种情况表示待删除的节点为头节点
            if (ptr->next == NULL)
            {
                ListNode * tmp = head;
                head = head->next;
                delete tmp;
            }
            else
            {
                ListNode * pre = NULL;
                ListNode * curr = head;
                //curr指针所指的节点到ptr指针所指的节点相距n个节点,将ptr移到指向最后一个节点时,此时curr节点指向倒数第n个节点
                while(NULL != ptr->next)
                {
                    ptr = ptr->next;
                    pre = curr;
                    curr = curr->next;
                }
                //此时curr指向倒数第n个节点,pre指向待删除节点的前一个节点
                pre->next = curr->next;
                delete curr;
            }
        }       
        return head;
    }
};
int main()
{
    ListNode * head = (ListNode*)malloc(sizeof(ListNode));
    head->val = 1;
    ListNode * p = (ListNode*)malloc(sizeof(ListNode));
    p->val = 2;
    p->next = NULL;
    head->next = p;
    Solution s;
    head = s.removeNthFromEnd(head,1);
    ListNode *ptr = head;
    while(ptr != NULL)
    {
        cout<<ptr->val<<'\t';
        ptr = ptr->next;
    }
    cout<<endl;
    return 0;
}
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:49031次
    • 积分:1366
    • 等级:
    • 排名:千里之外
    • 原创:90篇
    • 转载:2篇
    • 译文:0篇
    • 评论:3条