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

  • Post author:
  • Post category:其他




方法一



思路

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;
    }

请添加图片描述



版权声明:本文为weixin_42341543原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。