• 【Leetcode-easy】Remove Nth Node From End of List


    思路1:设置两个指针p1,p2指向表头,p1先走n步。再两个指针同时走。当p1指针指到链表尾部时,P2指针已经在需要删除节点的前一位。一定要注意一些细节。

     1 class ListNode {
     2     int val;
     3     ListNode next;
     4     ListNode(int x) { val = x; }
     5 }
     6 
     7 
     8 public ListNode removeNthFromEnd(ListNode head, int n) {
     9        if(head==null||n<=0){
    10            return head;
    11        }
    12        ListNode p1=head;
    13        ListNode p2=head;
    14 
    15        while(n!=0){
    16            if(p1.next!=null){
    17                p1=p1.next;
    18            }else if(n==1){
    19                return head.next;
    20            }else{
    21                return head;
    22            }
    23            n--;
    24        }
    25        
    26        //两个指针同时移动
    27        while(p1.next!=null){
    28            p1=p1.next;
    29            p2=p2.next;
    30        }
    31        //此时p2指针已经在倒数第n+1位,开始删除倒数第n位
    32        p2.next=p2.next.next;
    33        return head;  

    思路2:指针p1向前走n-1步,两个指针同时走,p1走到尾节点时,p2到达的节点就是需要删除的节点。此时,可以通过复制后一个元素val给前一个元素,再删除后一个元素即可。实现删除该元素。 要注意细节。

     1    public ListNode removeNthFromEnd1(ListNode head, int n) {
     2        if(head==null||n<=0){
     3            return head;
     4        }
     5        if(n==1){
     6            //如果删除倒数第一位,则直接删除
     7            if(head.next==null){
     8                return null;
     9            }else{
    10                ListNode h=head;
    11                while(h.next.next!=null){
    12                    h=h.next;
    13                }
    14                h.next=null;
    15                return head;
    16            }
    17           
    18        }
    19        ListNode p1=head;
    20        ListNode p2=head;
    21 
    22        while(n!=1){
    23            if(p1.next!=null){
    24                p1=p1.next;
    25            }else if(n!=1){    //如果n大于链表长度的情况
    26                return head;
    27            }
    28            n--;
    29        }
    30        
    31        //两个指针同时移动
    32        while(p1.next!=null){
    33            p1=p1.next;
    34            p2=p2.next;
    35        }
    36        //此时p2指针已经在倒数第n位,开始删除倒数第n位
    37        p2.val=p2.next.val;
    38        p2.next=p2.next.next;
    39        return head;   
    40    }  
  • 相关阅读:
    如何制作动态层分组报表
    填报表之数据留痕
    填报表中也可以添加 html 事件
    填报脚本之轻松搞定复杂表的数据入库
    在报表中录入数据时如何实现行列转换
    如何在报表中绘制 SVG 统计图
    如何用报表工具实现树状层级结构的填报表
    6.JAVA_SE复习(集合)
    JAVA_SE复习(多线程)
    数据库基本概念
  • 原文地址:https://www.cnblogs.com/scecit/p/4985143.html
Copyright © 2020-2023  润新知