leetcode题目19.删除链表的倒数第N个节点(中等)
题目描述:
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
进阶:
你能尝试使用一趟扫描实现吗?
题目解析:
我们可以设想假设设定了双指针p
和q
的话,当q
指向末尾的NULL
,p
与q
之间相隔的元素个数为n
时,那么删除掉p
的下一个指针就完成了要求。
- 设置虚拟节点
dummyHead
指向head
- 设定双指针
p
和q
,初始都指向虚拟节点dummyHead
- 移动
q
,直到p
与q
之间相隔的元素个数为n
- 同时移动
p
与q
,直到q
指向的为NULL
- 将
p
的下一个节点指向下下个节点
代码实现:
public ListNode removeNthFromEnd(ListNode head, int n) { if (head == null || n < 0) { return null; } ListNode dummyHead = new ListNode(0); dummyHead.next = head; //定义p、q指针 ListNode p = dummyHead; ListNode q = dummyHead; for (int i = 0; i <= n; i++) { q = q.next; } while (q != null) { q = q.next; p = p.next; } //将p指向的结点下一个结点,更改为p上一个结点的下一个结点,删除p指向的结点 p.next = p.next.next; return dummyHead.next; }
时间复杂度:O(L),该算法对含有 L 个结点的列表进行了一次遍历。因此时间复杂度为 O(L)。
空间复杂度:O(1),我们只用了常量级的额外空间。