题目链接:LeetCode-19 题目大意:移除倒数第n个节点
解题思路:首先就是两遍扫描 第一遍扫描出链表的长度 将倒数第n个节点转化为正数第n个节点 第二遍扫描进行删除 重点的进阶部分为 一趟扫描完成 我的实现思路是运用三个节点 一个前驱(second) 一个后驱(first) 一个后驱的前一个状态(rec) 和储存链表长度的size还有当前前驱的坐标值 一遍扫描 首先扫描的前提是前驱的下一个节点不能为空 扫描过程中 如果前驱的坐标值不等于n就让前驱向后移动一位 坐标加一 如果坐标值等于n 那么就让前后驱都向后移动一位(这里注意保存后驱移动前的节点 也就是rec要指向的节点)最后循环终止时 你会发现现在的前驱刚好落在要删除的节点上 那么要操作的节点就是记录前驱历史的rec (最后打个补丁 如果根据size发现删除的是头节点 直接操作head 不然会Wa) 看着挺花里胡哨的(其实是我表述不清) 找个长一点的例子试一下就明白了
代码块:
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { public ListNode removeNthFromEnd(ListNode head, int n) { // 第一种实现方式 扫描两遍 第一遍扫描出链表长度 第二遍根据正序位置解决问题 // 第二种实现方式 一趟扫描 ListNode first = head; ListNode second = head; ListNode rec = head; int size = 1; int index = 1; // 通过这个循环就可以让first指向要删除的节点 rec执行要改next的节点 while(second.next != null){ if(index == n){ rec = first; second = second.next; first = first.next; }else{ second = second.next; index++; } size++; } if(n == size){ head = head.next; }else if(rec.next != null){ rec.next = rec.next.next; } return head; } }