非商业,LeetCode链接附上:
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 保证是有效的。
进阶:
你能尝试使用一趟扫描实现吗?
代码实现:
//节点 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
原文:https://www.cnblogs.com/heibingtai/p/14133359.html