青岛网站建设有限公司/餐饮营销方案
问题
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
你能尝试使用一趟扫描实现吗?
示例 1:
输入:head = [1,2,3,4,5], n = 2 输出:[1,2,3,5] 示例 2:
输入:head = [1], n = 1 输出:[] 示例 3:
输入:head = [1,2], n = 1 输出:[1]
解决
双指针的经典应用,如果要删除倒数第n个节点,让fast移动n步,然后让fast和slow同时移动,直到fast指向链表末尾。删掉slow所指向的节点就可以了。
例如 {1,2,3,4} 移除 倒数第二个3
// 删除末尾第n个节点,使用一次遍历public Node removeTailNodeOfNNumber(Node headNode, Integer tailPlace) {Node fast = headNode;Node slow = headNode;// 设置虚拟节点,保存headNodeNode virtualNode = new Node(-1, headNode);// fast 先移动 tailPlace个位置while (tailPlace-1 > 0) {fast = fast.getNext();tailPlace--;}System.out.println(fast);// fast不等于null,才有继续的可能 fast.next为null时,那么fast为尾节点// slow 指向目标位置Node pre = virtualNode;while (fast.getNext() != null){// 全部向后移动一位pre = slow;slow = slow.getNext();fast = fast.getNext();}// 移除slow所指向的节点pre.setNext(slow.getNext());return virtualNode.getNext();}