zoukankan      html  css  js  c++  java
  • LeetCode:19. Remove Nth Node From End of List(Medium)

    1. 原题链接

    https://leetcode.com/problems/remove-nth-node-from-end-of-list/description/

    2. 题目要求

    给出一个链表,请删除倒数第n个结点并返回头节点

    注意:给出的n总在合法范围内;只用一次遍历

    3. 解题思路

    删除倒数第n个结点,正着数即删除从表头结点开始的第L-n+1个结点。创建一个表头结点来指向头结点。

    思路一:使用两次遍历。第一次遍历得到链表的长度,第二遍历删除第L-n+1个结点。

    思路二:使用一次遍历。使用两个指针first和second,开始时first和second都指向头结点head。first指针先到达正数第n个结点,second指针不动。然后两个指针同步向后移动,保持两个指针之间的gap为n。当first.next==null时,second指针指向倒数第n个结点。

    4. 代码实现

    package com.huiAlex;
    
    import java.util.List;
    
    /**
     * Definition for singly-linked list.
     * public class ListNode {
     * int val;
     * ListNode next;
     * ListNode(int x) { val = x; }
     * }
     */
    public class RemoveNthNodeFromEndofList19 {
        public static void main(String[] args) {
            ListNode l1 = new ListNode(1);
            ListNode l2= new ListNode(2);
            ListNode l3 = new ListNode(3);
            ListNode l4= new ListNode(4);
            ListNode l5 = new ListNode(5);
            ListNode l6= new ListNode(6);
            l1.next=l2;
            l2.next =l3;
            l3.next=l4;
            l4.next=l5;
            l5.next=l6;
    
            ListNode ls = RemoveNthNodeFromEndofList19.removeNthFromEnd(l1,3);
            ListNode ls2 = l1.next.next.next;
            System.out.println("头结点:"+ls.val);   // Expected:1
            System.out.println("删除nth结点后,其前驱结点的后继结点"+ls2.val);  // Expected:5
    
    
        }
        // 思路二代码实现
        public static ListNode removeNthFromEnd(ListNode head, int n){
            ListNode headPointer = new ListNode(0);
            headPointer.next = head;
            ListNode first = head,second = head;
    
            for(int i =0;i<n+1;i++){ // first指针到达din个结点
                first=first.next;
            }
    
            while(first!=null){  // 保持gap为n,两个指针同步后移
                first=first.next;
                second=second.next;
            }
            second.next=second.next.next;  //删除倒数第n个结点
    
            return headPointer.next;
    
        }
    
        // 思路一代码实现
        public static ListNode removeNthFromEnd2(ListNode head, int n) {
            ListNode headPointer = new ListNode(0);
            headPointer.next = head;
            ListNode first = head;
            int length = 0;
            while (first != null) {  // 第一次遍历得到链表的长度
                length++;
                first = first.next;
            }
            length -= n;  // 倒数第n个结点前面所有结点的长度
            first = headPointer;
            while (length > 0) {  // 第二次遍历找到倒数第n个结点
                length--;
                first = first.next;
            }
            first.next = first.next.next;  // 删除倒数第n个结点
            return headPointer.next;
        }
    
        public static class ListNode {
            int val;
            ListNode next;
    
            ListNode(int x) {
                val = x;
            }
        }
    
    }
    

      

  • 相关阅读:
    sqlserver中递归写法
    keytools命令生成证书
    java中sql语句快速处理
    select * 替换写法
    oracle行转列
    oracle中查看当前用户的表结构、主键、索引
    Servlet三种实现方式
    【python之旅】python的面向对象
    【python之旅】python的模块
    【python之旅】python的基础三
  • 原文地址:https://www.cnblogs.com/huiAlex/p/8097422.html
Copyright © 2011-2022 走看看