我的脑瘫思路,后面参考了快慢指针法才发现我写的是个什么玩意啊哈哈!
相当于把所有可能删除的情况都列举了,真是不嫌麻烦哈哈!
/** * 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 temp1 = head.next; int i = 1; while (temp1 != null) { i++; temp1 = temp1.next; } if (i == 1) { head = null; return null; } if (n == i) { head = head.next; return head; } if (n == i - 1) { head.next = head.next.next; return head; } int j = i-n-2; ListNode temp2 = head.next; for (int k = 0; k < j; k++) { temp2 = temp2.next; } temp2.next = temp2.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) { ListNode dummyHead = new ListNode(0); dummyHead.next = head; // 慢指针初始指向虚拟头结点 ListNode slow = dummyHead; // 快指针初始指向虚拟头结点 ListNode fast = dummyHead; // 快指针先向前移动n+1步 for(int i = 0; i <= n; i++) { fast = fast.next; } // 快慢指针同时向前移动,直到快指针指向null while (fast!=null){ fast = fast.next; slow = slow.next; } // 慢指针的下一个节点即待删除节点 ListNode delNode = slow.next; // 慢指针的后继指针指向待删除节点的下一个节点 // 这样就将待删除节点删除了 slow.next = delNode.next; delNode.next = null; return dummyHead.next; } }