力扣-19题(Java)-链表删元素

题目链接:https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/
题目如下:
在这里插入图片描述
在这里插入图片描述
解法一:两次循环

/**
 * 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) {
        ListNode pre=head;
        int len=0;
		//tip: 对于如果链表头节点会发生变动,常用手法:加一个虚拟头节点。这个程序中未使用
        //计算链表中节点的数量
        while(pre!=null){
            len++;
            pre=pre.next;
        }

        if(len==1&&n==1) return null;  //特殊情况判断 1、链表中只有一个情况
        if(len-n-1<0) return head.next;//特殊情况判断 2、要删除的是首个节点

        pre=head;
        for(int i=0;i<len-n-1;i++)//循环到达待处理的节点处
            pre=pre.next;

        if(pre.next==null) pre=null;//判断要删掉的节点是否为最后一个节点
        else pre.next=pre.next.next;

        return head;
    }
}

解法二:双指针法

/**
 * 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) {
        //tip:
        //1、头节点可能发生变动,增加一个虚拟节点
        //2、双指针间隔n个节点,后一个节点就先走i=0;i<=n;i++次数
        ListNode dummyhead=new ListNode(0);
        dummyhead.next=head;

        //双指针法,建立两个指针
        ListNode p=dummyhead;
        ListNode q=dummyhead;
        
        //0(虚拟)->1->2->3->4->5->null  n=2
        //4:0  5:1  null:2
        for(int i=0;i<=n;i++)
            q=q.next;

        while(q!=null){
            p=p.next;
            q=q.next;
        }

        p.next=p.next.next;//删除当前节点

        return dummyhead.next;

    }
}
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值