leetcode 19.删除链表的倒数第N个结点
思路:一开始想过用反转做,但是这里的链表顺序是不能改变的,所以我们需要在遍历一遍的基础上进行判断。
为什么首先要遍历一遍?因为此链表只是一个普通的不循环的链表,我们一开始并不清楚它的长度是多少,所以需要首先遍历一遍判断链表的长度,然后我们找到倒数第n个结点的坐标,进行基本的链表改写就行了。
注意:当我们删除头结点的时候,需要额外特殊判断一下,需要新创建一个结点,相当于给链表加了一个头,然后再进行改写箭头地址的操作就可以了。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode tmp=head;
int len=0;
while(tmp!=null){
len++;
tmp=tmp.next;
}
int cnt=0;
ListNode pre=head;
if(len-n-1<0){
ListNode dummy=new ListNode(-1);
dummy.next=head;
dummy.next=head.next;
return dummy.next;
}
else{
while(cnt!=len-n-1&&pre!=null){
cnt++;
pre=pre.next;
}
if(pre!=null){
ListNode now=pre.next;
pre.next=now.next;
}
return head;
}
}
}