LeetCode第19题之 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.

#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;
}
阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011954296/article/details/51541385
文章标签: leetcode
个人分类: LeetCode算法
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭