OJ 19 Remove Nth Node From End of List

来源:互联网 发布:nginx需要哪些运行库 编辑:程序博客网 时间:2024/05/23 00:01

题目要求:
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.
解题思路:
首先要找到这个点,然后删除
总共设计了两个函数,一个是删除单向链表中的某个节点的函数,还有一个是找到单向链表中倒数第n个节点函数。
首先,如何找到倒数第n个节点?用两个指针,第一个指针first先走n步,然后第二个指针second出发,与第一个指针同时向前,当第一个指针走到单向链表的最后,second所在的位置就是所要找的倒数第n个节点。不过上面的方法有一个漏洞,就是如果n大于链表的长度len的时候,一般题目会给出处理方法:

  1. n大于len直接返回错误
  2. n大于len,按len计算
  3. n大于len的时候,按照n%len计算

这里我们先假设所有的n都是不大于len的。
代码:

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode(int x) : val(x), next(NULL) {}* };*/struct ListNode{    int val;    ListNode *next;    ListNode(int x) : val(x), next(NULL)    {}};class Solution {public:    ListNode *removeNthFromEnd(ListNode *head, int n) {        ListNode *first = head;        int step = 1;        while (step < n && first != NULL)        {            first = first->next;            step++;        }        ListNode *second = head;        while (first != NULL&&first->next != NULL)        {            second = second->next;            first = first->next;        }        return removeNode(head, second);    }    ListNode *removeNode(ListNode *head, ListNode *thenode)    {        ListNode *tmp = head;        if (head == thenode)        {            return head->next;        }        while (tmp->next != thenode)        {            tmp = tmp->next;        }        tmp->next = thenode->next;        delete thenode;        return head;    }};
0 0