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个节点,如:a->b->c->d->e->NULL, n = 2,返回:a->b->c->e
解法1:先遍历一遍计算链表长度;再遍历一遍删除倒数第n个节点,该方法需要遍历两遍链表。
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* tmpHead = new ListNode(0);
tmpHead->next = head;
int length = 0;
for(ListNode* cur = tmpHead->next ; cur != NULL ; cur = cur->next )
length ++;
int k = length - n;
if (k < 0)
return NULL;
ListNode* cur = tmpHead;
for( int i = 0 ; i < k ; i ++ )
cur = cur -> next;
ListNode* delNode = cur->next;
cur->next = delNode->next;
delete delNode;
ListNode* retNode = tmpHead->next;
delete tmpHead;
return retNode;
}
};
解法2: 使用双指针, 对链表只遍历了一遍
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* tmpHead = new ListNode(0);
dummyHead->next = head;
ListNode* p = tmpHead;
ListNode* q = tmpHead;
for( int i = 0 ; i < n + 1 ; i ++ )
{
if (!q)
return "";
q = q->next;
}
while( q ){
p = p->next;
q = q->next;
}
ListNode* delNode = p->next;
p->next = delNode->next;
delete delNode;
ListNode* retNode = tmpHead->next;
delete tmpHead;
return retNode;
}
};