双指针解法或者快慢指针原题链接:https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/
实质上类似于做了一个减法,我们设从后往前数为倒序号,从前往后为正序号,那么 倒序号(1为起始下标)+正序号(1为起始下标)-1=总长度 ,由此公式可得:
- fast指针首先移动k个位置。
- slow指针和fast指针也一起移动,移动的基准为fast指针到底。
- 那么slow指针就刚好到我们要删除的元素的前一个位置。
- 以slow为基准,执行链表删除 *** 作即可。
由于链表具有头节点,那么上面的公式不应该减一,相当于正序号是从0开始的。
代码如下:
public ListNode removeNthFromEnd(ListNode head, int n) { ListNode fast = head; ListNode slow = head; //fast移n步,目的是为了判断删除的位置 for (int i = 0; i < n; i++) { fast = fast.next; } //如果fast为空,表示删除的是头结点 if (fast == null) { return head.next; } while (fast.next != null) { fast = fast.next; slow = slow.next; } //当前slow为要删除的第k个节点第前一个节点 slow.next = slow.next.next; return head; }递归解法
TODO
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)