zoukankan      html  css  js  c++  java
  • 链表--删除倒数第k个结点(leetcode19

    官方题解

    使用一个哑结点,这样可以减少很多判断情况

    • 方法1:遍历两次
    public ListNode removeNthFromEnd(ListNode head, int n) {
        ListNode dummy = new ListNode(0);
        dummy.next = head;
        int length  = 0;
        ListNode first = head;
        while (first != null) {
            length++;
            first = first.next;
        }
        length -= n;
        first = dummy;
        while (length > 0) {
            length--;
            first = first.next;
        }
        first.next = first.next.next;
        return dummy.next;
    }
    
    • 方法2:使用双指针遍历一次:
    public ListNode removeNthFromEnd(ListNode head, int n) {
        ListNode dummy = new ListNode(0);
        dummy.next = head;
        ListNode first = dummy;
        ListNode second = dummy;
        // Advances first pointer so that the gap between first and second is n nodes apart
        for (int i = 1; i <= n + 1; i++) {
            first = first.next;
        }
        // Move first to the end, maintaining the gap
        while (first != null) {
            first = first.next;
            second = second.next;
        }
        second.next = second.next.next;
        return dummy.next;
    }
    
    

    我的笨拙的解法,没有用哑结点,导致多了很多判断

        //遍历两次
    
        public static ListNode removeNthFromEnd(ListNode head, int n) {
            ListNode temp = head;
            int length = 0;
            while (temp != null) {
                length++;
                temp = temp.next;
            }
            if (length==1){
                return null;
            }
    
            int cursor = length-n;
    
            if (cursor==0){
                ListNode result = head.next;
                return result;
            }else {
                temp = head;
                for (int i = 0; i < cursor-1; ++i) {
                    temp = temp.next;
                }
                temp.next = temp.next.next;
    
                return head;
            }
    
    
    
        }
    
        //双指针遍历一次
    
        public static ListNode removeNthFromEnd1(ListNode head, int n) {
            ListNode temp1 = head;
            ListNode temp2 = head;
            for (int i = 0; i < n; ++i) {
    
                temp2 = temp2.next;
            }
    
            if(temp2==null&&temp1.next == null){
                return null;
            }
            if(temp2==null&&temp1.next != null){
                return head.next;
            }
    
            while (temp2.next!=null){
                temp1 = temp1.next;
                temp2 = temp2.next;
            }
    
            temp1.next = temp1.next.next;
            return head;
    
        }
    
    

    双指针这个思路要记住

  • 相关阅读:
    2019春第八周作业
    2019春第七周作业
    第六周作业
    币值转换
    打印沙漏
    秋季学期学习总结
    人生影响最大的三位老师
    自我介绍
    2018秋季学习总结
    自己
  • 原文地址:https://www.cnblogs.com/swifthao/p/12995445.html
Copyright © 2011-2022 走看看