算法流程:我们首先从头节点开始对链表进行一次遍历,得到链表的长度 L。随后我们再从头节点开始对链表进行一次遍历,当遍历到第 L− n + 1个节点时,它就是我们需要删除的节点。为了方便删除操作,我们可以从哑节点开始遍历 L − n + 1 个节点。当遍历到第 L − n + 1个节点时,它的下一个节点就是我们需要删除的节点,这样我们只需要修改一次指针,就能完成删除操作。
3、代码演示
publicListNoderemoveNthFromEnd(ListNode head,int n){// 创建一个哑节点(dummy node),其next指向链表的头节点,方便处理头节点的删除ListNode ya =newListNode(0,head);// 获取链表的长度 int length =getLength(head);// 初始化一个指针cur,指向哑节点ListNode cur = ya;// 移动cur指针到要删除节点的前一个节点// 因为是从末尾开始数,所以要移动cur到length - n的位置for(int i =1; i < length - n +1; i++){
cur = cur.next;}// 跳过要删除的节点,即让cur.next指向要删除节点的下一个节点
cur.next = cur.next.next;// 返回处理后的链表的头节点(由于有哑节点,所以返回ya.next)ListNode res = ya.next;return res;}// 辅助方法:获取链表的长度 publicintgetLength(ListNode head){int length =0;while(head !=null){
length++;
head = head.next;}return length;}