删除链表的倒数第N个节点
META
- URL: Leetcode.19 删除链表的倒数第N个节点
- 难度: 中等
- 分类: 链表操作
描述
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
进阶:
你能尝试使用一趟扫描实现吗?
思路
害!这题不是弱智嘛!看不起谁,这题还中等难度?
运指如飞,瞬间写好代码,提交!
噗次??怎么会错??再看了看题目,我操是倒数第N个啊,我当正数做的。
嘶🤔🤔🤔,倒数的话可有点麻烦了,单向链表也不能访问上一个元素,就算能访问上一个最后的算法也不能满足题目进阶要求中的一趟遍历啊。
(😈直接去题解那里看看别人的解法岂不美哉?)
哦对吼,我去看看...
(😇哦不你不能这样)
哦对对对,我是来学习的我不能这样...
那可咋办呢?? 诶有了!!!
我二年级的时候开始研究爱因斯坦的相对论手稿,看到过这样一段内容:
Leetcode第19题里,让你删链表掉倒数第N个元素,这是相对于链表最后一个元素来说的,也就是删掉从最后一个开始往前面数第N个。假设n为2,如图:
那么相对第N个元素,要删掉的就是链表的第1个元素,因为从N开始往前数N个就是第一个了嘛。。。那我们对链表进行遍历,从N开始设置curN为链表第1个元素(就是链表头),而且我们如果要删除的话还得记录前一个元素。这样当遍历完链表后,curN就是要删除的元素
OJBK,一趟遍历
代码
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
int i=1;
ListNode curNode=head,curN = null,curNPrev = null;
while(curNode!=null){
if (i==n){
curN = head;
}
if(i>n){
curNPrev = curN;
curN = curN.next;
}
curNode = curNode.next;
i++;
}
if(curNPrev!=null){
curNPrev.next = curN.next;
}else{
head = head.next;
}
return head;
}
}