19. 删除链表的倒数第N个节点

题目

(https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/)
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。

示例:

给定一个链表: 1->2->3->4->5, 和 n = 2.

当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:

给定的 n 保证是有效的。

进阶:

你能尝试使用一趟扫描实现吗?

分析

该方法没有实现一趟遍历
如果要实现一趟遍历。可以用快慢指针实现。快指针先走n步,然后慢指针开始行走。当快指针走到结尾时,慢指针删除下一个指针。

下面的方法是先一次遍历。计算出长度,在遍历一次

代码

public ListNode removeNthFromEnd(ListNode head, int k) {
        //头部节点
            ListNode tempHead = head;
            //遍历的时候第一次是指向head的next,所以初始化长度为1
            int length = 1;
            //遍历获取长度和尾节点
            while (null!=tempHead.next){
                tempHead = tempHead.next;
                ++length;
            }
            //因为删除链表的倒数第 n 个节点。所以要倒过来
            k = length -k;
            tempHead = head;
            for (int i = 1; i < k; i++) {
                tempHead = tempHead.next;
            }
            if(null == tempHead.next){
                return null;
            }
            if (k==0){
                return tempHead.next;
            }
            //链表删除指定位置
            if(null!=tempHead.next.next){
                tempHead.next = tempHead.next.next;
            }else {
                tempHead.next = null;
            }
            return head;
    }

结果

image.png

你可能感兴趣的:(19. 删除链表的倒数第N个节点)