1. 题目描述
2. Solution 1
1、思路分析
以 n = 2
dummy: 0 | 1 2 3 4 5 为例
s f
a、删除结点必定要先找到 待删除结点的前驱;
设待删除结点为p,其前驱为pre,通用删除操作: pre->next = p->next; 或 pre->next = pre->next->next;
b、本例中待删除的结点为倒数第n个结点,则其前驱结点为倒数第(n+1)个结点;
c、使用快慢指针,快指针先走n步,意图人为造一个n+1的区间 => 同步移动后,当快指针到链表尾时,慢指针在倒数第(n+1)位置;
d、结合c、与b、,搞定收工。
2、代码实现
package Q0099.Q0019RemoveNthNodeFromEndOfList;
import DataStructure.ListNode;
/*
以 n = 2
dummy: 0 | 1 2 3 4 5 为例
s f
1、删除结点必定要先找到 待删除结点的前驱;
设待删除结点为p,其前驱为pre,通用删除操作: pre->next = p->next; 或 pre->next = pre->next->next;
2、本例中待删除的结点为倒数第n个结点,则其前驱结点为倒数第(n+1)个结点;
3、使用快慢指针,快指针先走n步,意图人为造一个n+1的区间 => 同步移动后,当快指针到链表尾时,慢指针在倒数第(n+1)位置;
4、结合3、与1、,搞定收工。
*/
public class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
// 挂头结点的原因,若不挂,当n=1时,second.next 之后不会再有 next
ListNode dummy = new ListNode(0, head);
ListNode first = dummy.next, second = dummy;
// first 先走n步
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 dummy.next;
}
}
3、复杂度分析
时间复杂度: O(n)
空间复杂度: O(1)
原文地址:https://www.cnblogs.com/junstat/p/15978915.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。