/** * 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 ls = new LinkedList(); 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; } }