删除链表的倒数第n个节点
问题描述
leetcode 19. 删除链表的倒数第 n 个节点(倒数第1个节点表示顺数最后一个节点)
解题思路
可以将倒数问题,变出顺数问题来求解。先计算链表长度length,再转化为删除链表顺数第 length - n + 1 个元素
O(n)复杂度解法:使用一次遍历即可成功
我们可以先找到第 n 个节点 curNode,再设置一个 preNode 节点为被删除节点的前一个节点;
从第 n 个节点开始,curNode 和 preNode 一起向后移动,直到 preNode 成为被删除节点的前一节点 。
1 class Solution { 2 public ListNode removeNthFromEnd(ListNode head, int n) { 3 ListNode dummy = new ListNode(-1); 4 dummy.next = head; 5 ListNode curNode = dummy; 6 ListNode preNode = dummy; 7 int count = 0; 8 while(count < n) { 9 curNode = curNode.next; 10 count ++; 11 } 12 13 while (curNode.next!=null) { 14 preNode = preNode.next; 15 curNode = curNode.next; 16 } 17 18 preNode.next = preNode.next.next; 19 return dummy.next; 20 } 21 }