思路:
要想一次循环,一趟遍历完,那肯定是要想到双指针了,但是双指针怎么做呢?题目给出删除倒数第N个,我们如果能找到倒数第N个节点的前一个节点就行了,倒数第N个肯定是倒着数,那我们就让两个指针中间就差N个单位,当快指针走到链表最后一个的下一个null节点时,这时候慢指针就是倒数第N个节点的前一个节点了,因为快慢指针始终相差N个节点。
代码:
/*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val = val; }* ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode removeNthFromEnd(ListNode head, int n) {ListNode hair = new ListNode(-1,head);ListNode pre = hair, cur = head;for(int i=0;i<n;i++){cur = cur.next;}while(cur!=null){pre = pre.next;cur = cur.next;}pre.next = pre.next.next;return hair.next;}
}