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

    /**
     * Definition for singly-linked list.
     * public class ListNode {
     *     int val;
     *     ListNode next;
     *     ListNode(int x) { val = x; }
     * }
     */
    //因为要扫描一次即可,所以采用的是用一个数组保存每一个结点 ,然后用索引的方式进行查找对应的索引,再将结点进行组织
    //注意的事项是 【1】 1 不用直接return null 而是需要用head.next 所以我自己写的方法有两个亮点
    class Solution {
    	public ListNode removeNthFromEnd(ListNode head, int n) {
    		ListNode T = head;
    		LinkedList<ListNode> ls = new LinkedList<ListNode>();
    		while(T!=null) {
    			ls.add(T);
    			T = T.next;
    		}
    		int length = ls.size();
            if(length == n)
                return head.next;
    		ListNode temp = ls.get(length-n-1);
    		temp.next = temp.next.next;
    		return head;
    	}
    }
    

    还用另外一种方法真的是巧妙

    采取双重遍历肯定是可以解决问题的,但题目要求我们一次遍历解决问题,那我们的思路得发散一下。
    我们可以设想假设设定了双指针 p 和 q 的话,当 q 指向末尾的 NULL,p 与 q 之间相隔的元素个数为 n 时,那么删除掉 p 的下一个指针就完成了要求。
    设置虚拟节点 dummyHead 指向 head
    设定双指针 p 和 q,初始都指向虚拟节点 dummyHead
    移动 q,直到 p 与 q 之间相隔的元素个数为 n
    同时移动 p 与 q,直到 q 指向的为 NULL
    将 p 的下一个节点指向下下个节点

    解法多多 还望到对应的区域进行参考

    class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
    		ListNode ls = new ListNode(0);
    		ls.next = head;
    		ListNode ls1 = ls;
    		ListNode ls2 = ls;
    		for (int i = 0; i <= n; i++) {
    			ls1 = ls1.next;
    
    		}
    		while (ls1 != null) {
    			ls1 = ls1.next;
    			ls2 = ls2.next;
    		}
    		ls2.next = ls2.next.next;
    		return ls.next;
    	}
    
    }
    
  • 相关阅读:
    [转]android Intent机制详解
    [转]Android进程与线程基本知识
    HTML背景图片自适应
    边框边界填充理解
    [转]Android 代码自动提示功能
    [转]Windows7:Visual Studio 2008试用版的评估期已经结束解决方法
    eclipse安装、汉化、搭建安卓开发环境
    asp.net控件拖不动。控件错误
    opengl 入门浅学(一)
    opengl 无法定位程序输入点_glutInitWithExit于动态链接库glut32.dll上
  • 原文地址:https://www.cnblogs.com/cznczai/p/11198432.html
Copyright © 2011-2022 走看看