算法题(51):删除链表的倒数第N个节点

算法题(51):删除链表的倒数第N个节点_第1张图片

审题:

需要我们找到倒数第n个节点,并把他从链表中删除,然后把新的链表的头结点返回

思路:
该题的唯一难点就是如何找到单链表的倒数第n个节点

方法一:直接法

我们可以遍历一次单链表,然后把链表的总长度求出来,用总长度减去n可以得到要删除的节点的索引,然后从头再遍历一次就可以找到该节点。

不过为了将该节点从链表中删除,我们需要找到的其实是他的前一个节点,然后把前一个节点和他的后一个节点连起来。

方法二:栈

因为栈具有“后进先出”的性质,所以我们把链表的每个节点的地址存入栈后,弹出n次数据,弹完n次之后,栈顶的就是倒数第n个数据的前一个数据。

方法三:双指针

cur指针比prv指针提前n+1个位置,俩个指针一起移动,直到cur指向nullptr。此时prv指向的节点就是倒数第n个节点的前一个节点。

解题:

方法一:

(1)getlen

算法题(51):删除链表的倒数第N个节点_第2张图片

(2)核心代码

算法题(51):删除链表的倒数第N个节点_第3张图片

方法二:

算法题(51):删除链表的倒数第N个节点_第4张图片

注意:因为利用了栈这个结构,所以要注意控制条件,使用pop函数,或者top函数之前需要确保仍有数据在栈中

算法题(51):删除链表的倒数第N个节点_第5张图片

方法三:

算法题(51):删除链表的倒数第N个节点_第6张图片

19. 删除链表的倒数第 N 个结点 - 力扣(LeetCode)

你可能感兴趣的:(算法题,算法,链表,数据结构)