public ListNode removeNthFromEndListNode head int n ifhead==null return head; ListNode temp =head; int total=0; whiletempnext!=null total++;
这段代码的思路是先遍历整个链表,计算链表长度,然后再根据要删除的节点的位置进行删除操作。这样做的时间复杂度为 O(n),而题目要求的时间复杂度为 O(1)。
正确的思路是使用双指针,首先让一个指针先走 n 步,然后让两个指针同时往后走,直到第一个指针走到链表末尾。此时第二个指针所指的节点就是要删除的节点的前一个节点,直接将其 next 指向下一个节点即可。需要注意的是,当要删除的节点是头节点时,需要特殊处理。
下面是正确的实现代码:
public ListNode removeNthFromEnd(ListNode head, int n) { ListNode dummy = new ListNode(0); dummy.next = head; ListNode first = dummy; ListNode second = dummy; for(int i = 0; i <= n; i++) { first = first.next; } while(first != null) { first = first.next; second = second.next; } second.next = second.next.next; return dummy.next; }
原文地址: https://www.cveoy.top/t/topic/bXYU 著作权归作者所有。请勿转载和采集!