题目描述:
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例1:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
解题思路:
1、快慢指针:
可以使用快慢指针slow
和fast
指针,由于要删除倒数第n
个节点,因此首先要找到倒数第n
个节点的前一个节点,为了方便操作,新建一个头节点newhead
指向head
节点,然后初始化slow = fast = newhead
。
找到倒数第n + 1个
节点具体的方法是:快指针先往后走n
步,然后fast
和slow
同步向后面移动,直至fast.next == null
,这个时候slow
指针指向的就是倒数第n + 1
个节点,最后执行slow.next = slow.next.next
即可删除倒数第n
个节点。
注: 在链表问题中新建一个头节点有时候会让问题变得更加容易操作。
时间复杂度和空间复杂度: 时间复杂度为O(N),空间复杂度为O(1)。
实现代码:
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode newhead = new ListNode(-1);//辅助节点
newhead.next = head;
ListNode slow = newhead, fast = slow;
for(int i = 0; i < n; i++)
fast = fast.next;
while(fast.next != null){//找出倒数第n个节点的前一个节点:slow
slow = slow.next;
fast = fast.next;
}
slow.next = slow.next.next;//删除第n个节点
return newhead.next;
}