zoukankan      html  css  js  c++  java
  • LeetCode19----删除链表的倒数第N个节点

    给定一个链表,删除链表的倒数第 个节点,并且返回链表的头结点。

    示例:

    给定一个链表: 1->2->3->4->5, 和 n = 2.
    
    当删除了倒数第二个节点后,链表变为 1->2->3->5.
    

    说明:

    给定的 n 保证是有效的。

    进阶:

    你能尝试使用一趟扫描实现吗?

          因为链表的节点只有next指针,并且我们的题目要求只能扫描一次就完成删除,所以我们不能简单的创建一个数组来解决问题,所以我们可以这样来:

        (1)删除倒数第N个节点,我们让一个快指针指向正向第N个节点

        (2)定义一个慢指针,慢指针指向头节点

        (3)每个指针循环指向下一个节点,当快指针指向最后一个节点时,此时的慢指针指向的就是我们要删除的节点

    代码如下:

    public class LeetCode19 {
    	public static class ListNode {
    		int val;
    		ListNode next;
    
    		ListNode(int x) {
    			val = x;
    		}
    	}
    
    	public ListNode removeNthFromEnd(ListNode head, int n) {
    		if (head == null) {
    			return null;
    		}
    		int k = 0;
    		ListNode low = head;
    		ListNode fast = head;
    		while (k < n - 1) {
    			fast = fast.next;
    			k++;
    		}
    		ListNode lastLow = null;
    		while (true) {
    			if (fast.next != null) {
    				fast = fast.next;
    				lastLow = low;
    				low = low.next;
    			} else {
    				if (lastLow == null) {
    					return low.next;
    				} else {
    					lastLow.next = low.next;
    					low.next = null;
    					return head;
    				}
    			}
    		}
    	}
    }
    

      

  • 相关阅读:
    汉诺塔
    给出一个字符串,要求插入最少的字符,使得原字符串为一个回文串
    最长回文子串
    回文数 第N个回文数
    屋子里有1到100号100盏关闭的灯
    无头结点的单链表删除一个中间结点
    单链表逆转
    编程之美2.21 加法
    在一个数组中找 差值最大的两个数 差值最小的两个数 推广到 点对
    斐波那契
  • 原文地址:https://www.cnblogs.com/Booker808-java/p/9092494.html
Copyright © 2011-2022 走看看