给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
示例 1:
输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]
示例 2:
输入:head = [1], n = 1
输出:[]
示例 3:
输入:head = [1,2], n = 1
输出:[1]
提示:
链表中结点的数目为 sz
1 <= sz <= 30
0 <= Node.val <= 100
1 <= n <= sz
解题思路:主要使用快慢指针,先让快指针走到n位置,然后再让快慢指针一起走,走到快指针的结尾,慢指针就走了倒数第n个位置,然后slowNode!.next = slowNode.next?.next;即可
void main() {
ListNode l11 = ListNode();
ListNode? head = l11;
l11.next = ListNode(1);
l11 = l11.next!;
l11.next = ListNode(2);
l11 = l11.next!;
l11.next = ListNode(3);
l11 = l11.next!;
l11.next = ListNode(4);
l11 = l11.next!;
l11.next = ListNode(5);
l11 = l11.next!;
ListNode? printL1 = head.next;
while (printL1 != null) {
print('l1:${printL1.val}');
printL1 = printL1.next;
}
int n = 2;
ListNode? result = removeNthFromEnd(head.next, n);
while (result != null) {
print('result:${result.val}');
result = result.next;
}
}
ListNode? removeNthFromEnd(ListNode? head, int n) {
ListNode? result = ListNode();
result.next = head;
ListNode? fastNode = result;
ListNode? slowNode = result;
for (int i = 0; i < n; i++) {
fastNode = fastNode?.next;
}
while (fastNode?.next != null) {
fastNode = fastNode?.next;
slowNode = slowNode?.next;
}
slowNode!.next = slowNode.next?.next;
return result.next;
}
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/remove-nth-node-from-end-of-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。