一、题目
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
进阶:
你能尝试使用一趟扫描实现吗?
二、思路
使用快慢指针实现,一个快指针fast先走n步,然后当fast指针的next不为空的时候慢指针slow和fast一起走,最后fast指向倒数第二个结点,slow指向要删除的结点的前一个结点(第n+1个),只要将slow的next删除即可。
三、代码
/**
* 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) {
ListNode fast = head;
ListNode slow = head;
boolean flag = false;
for (int i = 0 ;i < n ; i++){//fast pointer walk n step ahead
if (fast.next == null){
flag = true;
break;
}
fast = fast.next;
}
if (flag){//should delete head node
head = slow.next;
slow.next = null;
return head;
}
while (fast.next != null){
fast = fast.next;//fast is not the last ,the last is it's next
slow = slow.next;//the prev node of last n
}
ListNode nNode = slow.next;
slow.next = nNode.next;
nNode.next = null;
return head;
}
}
四、测试效果