问题描述
* leetcode 19. 删除链表的倒数第n个节点(倒数第1个节点表示顺数最后一个节点)
解题思路
* 可以将倒数问题,变出顺数问题来求解。先计算链表长度length,再转化为删除链表顺数第 length - n + 1 个元素 * 高级解法:使用一次遍历即可成功:
* 我们可以先找到第n个节点curNode,再设置一个preNode节点为被删除节点的前一个节点
* 从第n个节点开始,curNode和preNode一起向后移动,直到preNode成为被删除节点的前一节点
* 截止5.30。耗时短于100%的提交答案。
唯一要求
* 注意被删除节点为头节点和头节点的next节点的情况。
1 public ListNode removeNthFromEnd2(ListNode head, int n) { 2 ListNode curNode = head; 3 ListNode preNode = head; 4 int count = 1; 5 while(count <= n) { 6 curNode = curNode.next; 7 count ++; 8 } 9 // 删除顺数第一个:10 if (curNode==null) {11 head = head.next;12 return head;13 }14 // 删除顺数第二个15 if(curNode.next==null && curNode != null) {16 head.next = head.next.next;17 return head;18 }19 while (curNode.next!=null) {20 preNode = preNode.next;21 curNode = curNode.next;22 23 }24 if(preNode.next!= null && preNode.next.next!=null) {25 preNode.next = preNode.next.next;26 } else {27 preNode.next = null;28 }29 return head;30 }