Day 6
题目:删除链表的倒数第N个节点
leetcode链接:删除链表的倒数第N个节点
要点:双指针
找到链表的倒数第N个节点
class Solution{
public ListNode findNthFromEnd(ListNode head, int n){
ListNode p1 = head;
// p1 先走 n 步
for(int i = 0; i < n; i++){
p1 = p1.next;
}
ListNode p2 = head;
// p1 和 p2 同时走 n-k 步
while(p1 != null){
p1 = p1.next;
p2 = p2.next;
}
// p2 现在指向第n-k+1个节点,即倒数第k个节点
return p2;
}
}
1、Java
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
// 虚拟头节点,避免删除的是第一个节点
ListNode dummy = new ListNode(-1);
dummy.next = head;
// 第一个指针
ListNode p1 = head;
// 先走n步
for(int i = 0; i < n; i++){
p1 = p1.next;
}
ListNode p2 = dummy;
// p1 和 p2 同时走N-n步
while(p1 != null){
p1 = p1.next;
p2 = p2.next;
}
// p2此时指向第N - n个节点,即倒数第n+1个节点
// 删除倒数第n个节点
p2.next = p2.next.next;
return dummy.next;
}
}
2、python
class Solution:
def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:
dummy = ListNode(-1)
dummy.next = head
p1 = head
for i in range(0, n):
p1 = p1.next
p2 = dummy
while p1 != None:
p1 = p1.next
p2 = p2.next
p2.next = p2.next.next
return dummy.next