原题: 删除链表倒数第N个节点
第一种解法:
本文适用于初学者。它介绍了以下内容:链表的遍历和删除其末尾的第 n 个元素。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
int length = 0;
ListNode curr = head;
while(curr.next != null){
curr = curr.next;
length++;
}
//获得长度以后,我们知道下一步我们根据n个节点来看待的话其实就是删除掉长度为length-n的节点就可以了,因为下标从0开始的
length = length - n ;
//用当前的节点遍历并到了0的时候退出循环,去掉next值
curr = head;
while(length > 0){
curr = curr.next;
length--;
}
//去掉中间第n个值
curr.next = curr.next.next;
//由于都是对象的引用所以原先的对象会持有对象引用
return head;
}
}
第二种解决方案:双指针解决方案
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode begin = new ListNode(0);
begin.next = head;
//只用一个循环实现
ListNode fNode = begin;
ListNode bNode = begin;
while(fNode.next != null)
{
//前n步不做处理因为相差n步可以理解为相对运动也就是说
if(n > 0){
fNode = fNode.next;
//保证走n步
n--;
}else{
fNode = fNode.next;
//以后开始继续走了,那么当fNode.next =null的时候为最后的尾节点,这个时候的pointerB所指向的那个bNode节点则是倒数第n个节点。
bNode = bNode.next;
}
}
bNode.next = bNode.next.next;
return begin.next;
}
}