zoukankan      html  css  js  c++  java
  • .从列表结束中删除第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;
    	}
    

      

  • 相关阅读:
    json_decode 转数组
    json_encode转义中文问题
    ECshop后台新功能权限添加
    mysql中int、bigint、smallint 和 tinyint的区别与长度的含义
    mysql数据库表设计小数类型
    mysql group_concat用法
    PHP socket通信之UDP
    本地tp项目上传服务器报runtime/cache错误
    mysql 命令一套
    linux 9 -- 交互式使用Bash Shell
  • 原文地址:https://www.cnblogs.com/K-artorias/p/7928304.html
Copyright © 2011-2022 走看看