给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
进阶:
你能尝试使用一趟扫描实现吗?
解题思路:
主要是利用双指针法,从头到尾依次遍历,这两个指针相隔N个节点,这样的话,快指针到最后一位的时候,满指针正好指向要删除的节点。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
//先判断头结点
if(head.next==null) return null;
//定义两个节点,一个比另一个快,相差N个节点,这样,当第一个走到尾节点的时候,第二个节点指向的正是要删除的节点
ListNode first = head;
ListNode second = head;
//先让第一个走N步
for (int i = 0;i<n;i++) {
first=first.next;
}
//判断是否已经是尾节点了,如果是,那就直接返回头节点
if(first == null) {
head=head.next;
return head;
}
//两个节点都同时往后走
while(first.next!=null) {
second = second.next;
first=first.next;
}
//删除节点second
//second.val = second.next.val;
second.next = second.next.next;
return head;
}
}