一:题目
二:题目解答
首先我们先想到,既然是要删除倒数第n个节点。那么我们先一遍遍历得到链表的总长度,然后在根据n值,找到要删除的前一个节点,进行删除就可以了。在这里需要注意的是,为了避免链表只有一个节点,而这个节点要被删除的情况,我们建立的指针最好是哑结点的。代码如下:
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
int[] ans = new int[100];
ListNode tmp = head;
int i = 0;
while (tmp != null) {
ans[i++] = tmp.val;
tmp = tmp.next;
}
System.out.println(i);
int taget = i - n;
ListNode answer = new ListNode(-1);
answer.next = head;
ListNode tmp2 = answer;
for (int j = 0; j < taget; j++) {
tmp2 = tmp2.next;
}
tmp2.next = tmp2.next.next;
return answer.next;
}
看了答案后。感觉自己算法很多地方可以优化,先对其进行改进:
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode tmp=new ListNode(-1);
tmp.next=head;
int length=0;
ListNode first=head;
while(first!=null){
length++;
first=first.next;
}
System.out.print(length);
int target=length-n;
ListNode second=tmp;
for(int j=0;j<target;j++){
second=second.next;
}
second.next=second.next.next;//删除一个元素
return tmp.next;
}
}