题目描述
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
进阶:
你能尝试使用一趟扫描实现吗?
思路与解答
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*思路:使用双指针法
*先让指针first指向头结点,然后向后走n步
*再让second指针指向头结点,跟着first指针向后走
*一直走到first.next指针指向空
*这是因为first.next指针和second指针之间的距离是n,所以second指针
*指向的那个结点就是要删除的那个结点的前一个结点
*注意删除的是第一个结点的情况
*/
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode first = head;
ListNode second = head;
if(head == null){
return null;
}
//先让first指针向后走n步
for(int i = 0; i < n; i++)
first = first.next;
//如果删除的是第一个结点,走了n步发现指向空说明删除的是第一个结点
if(first == null){
head = head.next;
return head;
}
//然后让second指针和first指针一起走,直到first指针指向null
while(first.next != null){
first = first.next;
second = second.next;
}
//此时second指向要删除的结点的前一个结点
second.next = second.next.next;
return head;
}
}