删除链表倒数第N个结点,首先肯定是要找到结点位置的,所以就看怎么快速找第N个位置。
思路1:假设链表长度为L,那么倒数第N个位置就是正数的第L-N+1个位置,比较简单吧,一个班50个同学,倒数第2名,那就是正数第49名(50-2+1)。
思路2:快慢指针,来两个指针,第一个先走N步,然后第一个和第二个一起开始走,第一个走到末尾了,第二个走到N-1的位置,下一个位置就是N。思路3:使用递归进行删除。
public void remove(ListNode head, int n) { if (head != null) { remove(head.next, n); } }完善
private int cur = 0; public void remove(ListNode head, int n) { if (head != null) { remove(head.next, n); if (cur++ == n) { head.next = head.next.next; } } }细节
public ListNode removeNthFromEnd(ListNode head, int n) { remove(head, n); return cur == n ? head.next : head; }回顾