• .从列表结束中删除第N个节点


    描述

    给定一个链表,从列表的最后删除倒数第n个元素

    例如:

      给定链表:1-> 2-> 3-> 4-> 5,并且n = 2。
    
      删除倒数第二个,链表将变为1-> 2-> 3-> 5。
    

    链表定义:

     * Definition for singly-linked list.
     * public class ListNode {
     *     int val;
     *     ListNode next;
     *     ListNode(int x) { val = x; }
     * }
     */
    

    我的方法

    public ListNode removeNthFromEnd(ListNode head, int n) {
            if(n==0) return head;
            int len=0;
            ListNode temp = head;
            //检测出链表长度
            while(temp.next != null){
                len++;
                temp = temp.next;
            }
            
            //如果要取出的是链表头,那么直接返回链表下一个引用
            if(len-n+1 == 0) return head.next;
            
            //特殊情况:当要去掉的是末尾元素时
            if(n==1){
            	//特殊情况中的特殊情况:当链表只有一项,且要取出的是结尾元素,那么就相当于清空链表,返回控制内即可
                if(len==0){
                    return null;
                }
                //当链表长度>1时
                int i=0;
                temp = head;
                while(i<len-1){
                    i++;
                    temp = temp.next;
                }
                temp.next = null;
                return head;
            }
            
            //一般状况
            //找到要跳过的那个元素的前一个元素,让这个元素的指针指向下一个的下一个元素:temp.next.next
            int i=0;
            temp = head;
            while(i < len-n){
                temp = temp.next;
                i++;
            }
            temp.next = temp.next.next;
            return head;
        }
    

    leetcode讨论区的方法

    public ListNode removeNthFromEnd1(ListNode head, int n) {
    	    
    	    ListNode start = new ListNode(0);
    	    ListNode slow = start, fast = start;
    	    slow.next = head;
    	    
    	    //移动快指针,让快指针与慢指针的距离为n,即慢指针落后n+1位此时慢指针的next还是head
    	    for(int i=1; i<=n+1; i++)   {
    	        fast = fast.next;
    	    }
    	    //同时移动快慢指针,当快指针到达最后时,慢指针指向的正好是要跳过的节点的父节点
    	    while(fast != null) {
    	        slow = slow.next;
    	        fast = fast.next;
    	    }
    	    //跳过这个节点
    	    slow.next = slow.next.next;
    	    return start.next;
    	}
    

      

  • 相关阅读:
    jdk动态代理底层实现
    SpringMvc执行流程及底层代码流程
    JavaWeb02-JSP数据交互
    JavaWeb01-动态网页
    异常总结
    优雅代码
    flask 脚本迁移语句
    git 拉取分支合并master&&回滚
    创建型设计模式
    基于mybatis的一个分表插件
  • 原文地址:https://www.cnblogs.com/K-artorias/p/7928304.html
Copyright © 2020-2023  润新知