public ListNode removeNthFromEnd(ListNode head, int n) { ListNode fastNode; ListNode slowNode; ListNode dummyHead = new ListNode(); dummyHead.next = head; fastNode = dummyHead; slowNode = dummyHead; while (n > 0){ fastNode = fastNode.next; n--; if (fastNode == null){ return null; } } while (fastNode.next != null){ slowNode = slowNode.next; fastNode = fastNode.next; } slowNode.next = slowNode.next.next; return dummyHead.next; }
本题思路:定义一个虚拟头结点,然后一个快结点和一个慢结点,之后快结点向后移n位,这是为什么呢,移动之后快结点和慢结点就形成了一个区间,这个区间向后移动到最后一个结点的时候,正好慢节点在删除节点的前一位,再通过slowNode.next = slowNode.next.next赋值,就可以删除倒数第n个结点了。 当n大于链表的长度的时候,第一次移动必然会导致快结点变成null,所以判断一下,若快结点是null,直接返回null。