给出一个单向链表,删除从结尾开始的第N个节点。
思路:
因为是单向链表,所以不能从尾到头数第N个元素。
指针只能从左向右走。
可以用两个指针,它们之间间隔N个节点,两个指针一起向右走,
直到右边的指针走到尽头,那左边的指针指向的就是从结尾开始的第N个节点。
注意左边的指针要是第N个节点的前一个节点,这样才能通过next指针作删除操作。
为了避免head节点本身也被删掉,定义一个newHead, newHead.next = head,
不管怎么操作,newHead都不会受到影响,
那么最后返回newHead.next即可。
定义左边指针为pre (指向从结尾开始第N个节点的前一个节点),
右边指针就拿head来充数(节省内存)。
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode newHead = new ListNode();
newHead.next = head;
ListNode pre = newHead;
for(int i = 1; i < n; i++) {
head = head.next;
}
while(head.next != null) {
pre = pre.next;
head = head.next;
}
head = pre.next;
pre.next = head.next;
head.next = null;
return newHead.next;
}