解题思路:
- p2先走了n步,这样p2和p1之间差n个节点。
- p2和p1一起往后移动,当p2移动到了null的时候,p1移动到了倒数第n+1个节点的位置。
- 改变p1->next将他指向他的下一个节点的下一个节点,这样就是把倒数第n个节点给删掉了。
时间复杂度:O(N)
代码实现:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
/**
* 使用两个工作指针p1,p2
* p1指向头结点,p2指向顺数第n+1个节点
* p1,p2同时后移,当p2移动到末尾时,p1指向倒数第n+1个节点
* 单链表:删除倒数第n个节点,则需指针记录倒数第n+1个节点
*/
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode p1, p2;
p1 = p2 = head;
// p2移动到第n+1的位置
for (int i = 0; i < n; i++) {
p2 = p2.next;
}
// 判断p2是否移动到链表末尾,即n等于链表的长度。
if (p2 == null) {
head = head.next;
return head;
}
// p1,p2同时后移
while (null != p2.next) {
p1 = p1.next;
p2 = p2.next;
}
p1.next = p1.next.next;
return head;
}
}
网友评论