174 - 删除链表中倒数第n个节点

本文介绍了一种算法实现,用于删除单链表中倒数第N个节点的方法。通过一次遍历实现,并讨论了边界条件的处理。

4.12

还是要注意边界值的处理啊

总不是能一次考虑好

/**
 * Definition for ListNode.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int val) {
 *         this.val = val;
 *         this.next = null;
 *     }
 * }
 */ 
public class Solution {
    /**
     * @param head: The first node of linked list.
     * @param n: An integer.
     * @return: The head of linked list.
     */
    ListNode removeNthFromEnd(ListNode head, int n) {
        if(head == null){
            return head;}
        ListNode tmp = head;
        ListNode flag = head;
        for(int i = 0;i < n;i++){
            if(tmp.next != null){
                tmp = tmp.next;
            }
            else{
                break;//return head;
            }
        }
        while(tmp.next !=null){
            tmp = tmp.next;
            flag = flag.next;
        }
        if(flag == head){
            return head.next;
        }
        flag.next = flag.next.next;
        return head;// write your code here
    }
}


在Java中,实现删除链表倒数第N个节点有两种常见的方法,分别是递归法和双指针法。 ### 递归法 递归法的思路是通过递归函数检查当前节点的下一个节点倒数第几个节点,并在满足条件时删除目标节点。 ```java class ListNode { int val; ListNode next; ListNode() {} ListNode(int val) { this.val = val; } ListNode(int val, ListNode next) { this.val = val; this.next = next; } public ListNode getNext() { return next; } public void setNext(ListNode next) { this.next = next; } } public class Solution { /** * 删除倒数第n个节点 * @param head 头结点 * @param n 倒数第n个节点 * @return 删除倒数第n个节点后的链表 */ public ListNode removeNthFromEnd(final ListNode head, final int n) { ListNode s = new ListNode(-1, head); // 头哨兵 checkAndDel(s, n); return s.getNext(); } /** * 检查当前节点的下一个节点倒数第几个节点并且删除目标节点 * @param node 当前节点 * @param n 目标 * @return 当前节点的下一个节点倒数第几个节点 */ private int checkAndDel(final ListNode node, final int n) { if (node.getNext() == null) { // 如果当前节点的下一个节点为空,说明已经到了最后一个节点,返回0 return 0; } else { int num = checkAndDel(node.getNext(), n) + 1; // 当前节点的下一个节点倒数第几个节点 if (num == n) { // 如果当前节点的下一个节点倒数第n个节点,就删除当前节点的下一个节点 node.setNext(node.getNext().getNext()); } return num; // 返回当前节点的下一个节点倒数第几个节点 } } } ``` ### 双指针法 双指针法的思路是使用两个指针,一个右指针先移动N步,然后左右指针同时移动,当右指针到达链表末尾时,左指针刚好指向要删除节点的前一个节点,然后删除节点。 ```java 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 ans = new ListNode(0, head); ListNode left = ans; ListNode right = ans; while (n-- > 0) { right = right.next; } while (right.next != null) { left = left.next; right = right.next; } left.next = left.next.next; return ans.next; } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值