非商业,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