您的位置:首页 > Web前端 > Node.js

LeetCode之“链表”:Remove Nth Node From End of List

2015-06-27 10:55 615 查看
  题目链接

  题目要求:

  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.

  这道题比较常规的想法是先算出链表长度len,再将头指针移动len-n步就可以到达待删节点了。具体程序如下(4ms):

/**
* 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) {
if(!head)
return head;

int len = 0;
ListNode *start = head;
while(start)
{
len++;
start = start->next;
}

if(len == n)
{
start = head;
head = head->next;
delete start;
start = nullptr;
return head;
}

ListNode *preNode = head;
start = preNode->next;
int k = 1;
while(k < len - n)
{
preNode = start;
start = start->next;
k++;
}

preNode->next = start->next;
delete start;
start = nullptr;

return head;
}
};


  另一个比较巧妙的方法就是先定义一个慢指针(初始值为头指针父指针),让头指针移动n步,再让头指针和一个慢指针同时移动直至头指针为空,这时慢指针指向的下一个节点就是待删节点。具体程序日如下(4ms):

/**
* 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) {
if(!head)
return head;

ListNode *dummy = new(nothrow) ListNode(INT_MIN);
assert(dummy);
dummy->next = head;

for(int i = 0; i < n; i++)
head = head->next;

ListNode *preNode = dummy;
while(head)
{
head = head->next;
preNode = preNode->next;
}

ListNode *delNode = preNode->next;
preNode->next = delNode->next;
delete delNode;
delNode = nullptr;

head = dummy->next;
delete dummy;
dummy = nullptr;

return head;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: