【力扣19】删除链表的倒数第 N 个结点

方法一

思路

1、计算链表总长度len
2、如果需要删除倒数第n个节点,需要寻找第len-n个节点,并将第len-n个节点的next设置为第len-n-2个节点

代码

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
   public ListNode removeNthFromEnd(ListNode head, int n) {
          int len=0;
          //前面放一个节点,为了方便统一处理头节点
          ListNode temp=new ListNode(0,head);
          head=temp;
          //计算链表长度
          while(temp!=null){
              len++;
              temp=temp.next;
          }
          temp=head;
          if(len==1 || len==2){
              return null;
          }     
          //如果需要删除第n个节点,那我们就需要寻找第len-n个节点   
          int index=1;
          while(index!=len-n){
              index++;
              temp=temp.next;
          }          
          temp.next=temp.next.next;
          return head.next;
    }
}

在这里插入图片描述

方法二

思路

1、我们在链表第一个数前面添加一个节点,并且默认链表最后一个数的后面是null。
2、需要删除倒数第n个数,需要找到倒数第n+1个数,倒数第n+1个数距离null中间有n个数,利用这个条件我们可以做如下:
·定义p,q节点分别指向链表头节点
·当p-q之间的距离小于n时,q往后移动
·当p-q之间的距离等于n时,p,q均往后移动
直到q=null,则p就是倒数第n+1个数,让其指向后面的后面即可

代码

public ListNode removeNthFromEnd(ListNode head, int n) {           
            ListNode p=new ListNode(0,head);
            ListNode q=p;
            ListNode temp=p;
            int inter=-1;
            while(inter<=n){
                if(q==null){
                    p.next=p.next.next;
                    return temp.next;
                }
                if(inter==n){
                    p=p.next;
                    q=q.next;
                }else{
                 inter++;
                q=q.next;
                }                                
            }
          return temp.next;
    }

请添加图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值