题目:
给定一个链表,从链表末尾删除第n个节点并返回其头部。
Given a linked list, remove the n-th node from the end of list and return its head.
Given linked list: 1->2->3->4->5, and n = 2. After removing the second node from the end, the linked list becomes 1->2->3->5. Note: Given n will always be valid. Follow up: Could you do this in one pass?
思路:
类似找出链表末尾第k个数的情况
大概方法:先用一个指针走k步,再用另一个指针从头部开始走,直到前面的指针到达链表尾部,此时后面的指针到达倒数第k个结点位置。但是因为此处是需要删除,所以具体使用的是指向倒数第k+1的位置的指针
【注意】
1. 链表小于k
2. 链表刚好等于k
【代码】
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode front = head;
int step = 0;
while(front!=null && step<n) {
front = front.next;
step++;
}
// n大于链表长度
if(step!=n) {
return null;
}
// n刚好等于链表长度,表示要删除的是第一个
if(front==null && step == n) {
return head.next;
}
ListNode last = head;
while(front.next!=null) {
front = front.next;
last = last.next;
}
// 删除第n个结点
last.next = last.next.next;
return head;
}
}