简单算法(暴力)
暴力很好想,没啥难度。扫一遍得到链表长度L。然后再扫一遍删第L-n个节点。
没啥写的,代码难度看上去不难。
一趟扫描
就相当于找个人用长为n的绳子把你俩绑在一起,你不会走路了坐在轮椅上(0.0)。他走到终点,你也就走到倒数第n+1个节点的面前了,伸手就能拿掉第n个结点。
整体上注意的点在于:
- 你这两个指针,一个领头的leader也就是代码中的first到底走到哪里second才能刚好删除要删除的节点。
- 万一要删除的是第一个结点怎么办。
防止删除的是第一个节点:建立一个头结点。这样删除第一个节点后直接返回NULL;
注意second位置:我写的时候全部用的for循环。简单点的话可以一个n循环先把绳子绷紧(first先走n步),然后while去让first走到链尾。
整体上,因为好久没敲代码了,天天看考研书看的习惯了->,其实还是(.)方便,发现之后懒得改了。并且第一天刷LeetCode,草率了点。以后慢慢修改。
具体代码:
/**
* 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 *dummy=new ListNode(0);
dummy->next=head;
ListNode *first=dummy,*second=dummy;
int num=0;
for(ListNode *k=head;k!=NULL;k=k->next){
if(num==n){
first=first->next;
second=second->next;
}
else{
first=first->next;
num++;
}
}
second->next=second->next->next;
return dummy->next;
}
};