Given a linked list, remove the n-th node from the end of list and return its head.
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.
最开始的时候审错题目了,注意是从尾部开始的第几个。
在debug的时候很搞笑的是使用printf(length);丝毫没觉得有任何问题,真是写python写习惯了哈哈哈,有的句子都不加分号了。
自己写的最暴力的算法。
提交报错:
member access within null pointer of struct"ListNode"
应该还是指针的问题吧,估计。http://blog.sina.com.cn/s/blog_12af6f37f0102wrs7.html
不知道该怎么改,放弃了。
/** * 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) { //记住仔细审题啊,让算的是从尾部开始的第n个 int length=0; ListNode* pre=head; while(pre!=NULL){ pre=pre->next; length++; } printf("%d\n",length); if(length<=1){ return head->next; } pre=head; for(int i=1;i<length-n+1;i++){ pre=pre->next; } pre->next=pre->next->next; return head; } };
以下,继续学习优秀算法。
对于之前的算法进行优化,需要找的是倒数第N个,那么就使用两个指针,其中一个比另一个多走n步,一个到了终点,另一个也就到了所要求的地方。
/** * 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) { //记住仔细审题啊,让算的是从尾部开始的第n个 //实际上是没有头节点的,所以手动创建一个头节点 ListNode* pre=new ListNode(0); pre->next=head; ListNode* sec=pre; ListNode* fir=pre; for(int i=0;i<n;i++){ sec=sec->next; } while(sec->next!=NULL){ sec=sec->next; fir=fir->next; } fir->next=fir->next->next; return pre->next; } };
就像找一个列表的中间位置的值一样。
这个其实这是对之前的方法做了优化,但使却没有出现null pointer的问题,大概是上面的代码错了吧 唉。