首页 > 其他 > 详细

LeetCode19-删除链表的倒数第N个节点

时间:2020-12-14 18:44:49      阅读:18      评论:0      收藏:0      [点我收藏+]

 

非商业,LeetCode链接附上:

https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/

进入正题。

 

题目:

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

 

示例:

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

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


说明:

给定的 n 保证是有效的。

进阶:

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

 

代码实现:

//节点
class ListNode {
    int val;
    ListNode next;
    public ListNode(int val) {
        this.val = val;
    }
}

public ListNode removeNthFromEnd(ListNode head, int n) {

        ListNode dummyNode = new ListNode(0);
        dummyNode.next = head;

        ListNode first = head;//注意first和second的初始值设置
        ListNode second = dummyNode;

        for(int i = 0; i < n; i++) {
            first = first.next;
        }

        while(first != null) {
            first = first.next;
            second = second.next;
        }

        second.next = second.next.next;

        return dummyNode.next;
}
//时间复杂度O(n),空间复杂度O(1)

 

分析:

在单链表中,如果要删除某个节点,需要先找到此节点的前一个节点;

设置dummyNode(哑节点),作为整个链表度的前置节点,简化算法的实现;

另外设置两个节点,通过对“first”节点进行更早对“n”次遍历后移,之后和“second”节点同时移动,找到被删除节点对前一个节点;

要注意“first”和“second”节点的设置,如果设置在相同的开始位置,则得到的是倒数第N个节点,在算法中设置“second”在更前一个位置上,则可以得到被删除节点的前一个节点。

 

--End 

 

LeetCode19-删除链表的倒数第N个节点

原文:https://www.cnblogs.com/heibingtai/p/14133359.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!