【中】3、删除链表的倒数第N个节点

题目描述:

给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。

示例:

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

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

给定的 n 保证是有效的。

进阶:

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

思路分析:

设置两个指针,快指针先走n步,然后两个指针一块走,直到快指针走到链尾,此时慢指针的下下个节点即为要被剔除的节点。

代码实现:

class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        ListNode headNode = new ListNode(0);
        headNode.next = head;
        //设置快慢指针
        ListNode slow = headNode;
        ListNode fast = headNode;
        //快指针先走n
        for(int i = 0; i < n ;i++){
            fast = fast.next;
        }
        //快慢指针一起走,直到快指针next为空
        while(fast.next != null){
            slow = slow.next;
            fast = fast.next;
        }
        slow.next = slow.next.next;
        return headNode.next;
    }
}

复杂度分析:

时间复杂度:时间复杂度:O(L),该算法对含有 L 个结点的列表进行了一次遍历。因此时间复杂度为 O(L)

空间复杂度:O(1),我们只用了常量级的额外空间

发布了28 篇原创文章 · 获赞 9 · 访问量 4671

猜你喜欢

转载自blog.csdn.net/chixi123/article/details/103773599