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.
单链表的题,简单。
陷阱:没有传统的head指针。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) {
struct ListNode* trueHead=(struct ListNode*)malloc(sizeof(struct ListNode));//注意指针类型的转换
trueHead->next = head;
struct ListNode* pointPtr= trueHead->next;
int len=0;
while( pointPtr )//遍历求长度
{
++len;
pointPtr = pointPtr->next;
}
pointPtr= trueHead;
for(int i=0; i < len-n; ++i)
{
pointPtr = pointPtr->next;
}
pointPtr->next = pointPtr->next->next;
head = trueHead->next;
return head;
}
};
查看其它高人的代码,发现一些匪夷所思的方法,特转载到此处,借鉴学习。
地址:https://leetcode.com/discuss/36163/4ms-c-solution
/**
* 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) {
ListNode*p1, *p2, *p3;
if (head->next == NULL) return NULL;
else
{
p1 = p2 = head;
p3 = p2;
for (int i = 0; i < n-1 ; i++) p1 = p1->next;
while (p1->next)
{
p3 = p2;
p1 = p1->next;
p2 = p2->next;
}
if (p2 == head)
{
head = head->next;
p2->next = NULL;
free(p2);
}
else
{
p3->next = p2->next;
p2->next = NULL;
free(p2);
}
return head;
}
}
};
地址:https://leetcode.com/discuss/37464/c-7-lines-solutions
ListNode *fast = head, **cur = &head;
while(n--) fast = fast->next;
while (fast) {
fast = fast->next;
cur = &(*cur)->next; }
*cur = (*cur)->next;
return head;