美文网首页
leetcode链表—19. 删除链表的倒数第 N 个结点

leetcode链表—19. 删除链表的倒数第 N 个结点

作者: 小胖学编程 | 来源:发表于2021-07-09 00:17 被阅读0次

    19. 删除链表的倒数第 N 个结点

    image.png

    1. 总结

    快慢指针法:

    删除倒数第n个元素,若只遍历一次,那么需要两个指针,当“快指针”指向倒数第一个元素时,“慢指针”指向倒数第n+1个元素(相对相差n个位置)。

    • 当慢指针指向倒数第n+1个元素时,可以删除倒数第n个元素;

    极端情况:当链表长度为n个时,倒数第n个节点的位置,即第一个节点

    链表长度为n个,快指针移动n步,“快指针”指向null节点。通过fast==null可以判断出极端情况。可以直接删除头节点。

    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 {
    
    
        /**
         *
         * 1,2,null
         *      f
         *   s
         * 要删除下一个节点,则需要持有到上一个节点
         * 快慢指针:
         * 1. 快指针走到最后,可能要删除第一个元素;
         * 2. 快指针和慢指针相差n步,当快指针指向最后一个元素时,此时慢指针即为倒数第n+1个节点
         */
        public ListNode removeNthFromEnd(ListNode head, int n) {
            ListNode fast = head;
            ListNode slow = head;
            /**
             * 快指针,先走n步
             */
            for (int i = 0; i < n; i++) {
                fast = fast.next;
            }
            if (fast == null) {
                return head.next;
            }
    
            /**
             * 当需要删除倒数第n个元素时,指针坐标应该指向倒数第n+1个
             * 即获取相对位置。
             *
             */
            while (fast.next != null) {
                fast = fast.next;
                slow = slow.next;
            }
    
            slow.next = slow.next.next;
            return head;
        }
    }
    

    相关文章

      网友评论

          本文标题:leetcode链表—19. 删除链表的倒数第 N 个结点

          本文链接:https://www.haomeiwen.com/subject/znuxpltx.html