📝 面试求职: 「面试试题小程序」 ,内容涵盖 测试基础、Linux操作系统、MySQL数据库、Web功能测试、接口测试、APPium移动端测试、Python知识、Selenium自动化测试相关、性能测试、性能测试、计算机网络知识、Jmeter、HR面试,命中率杠杠的。(大家刷起来…)
📝 职场经验干货:
给定一个链表,要求删除链表中的倒数第 K 个节点。链表可以被视为一个节点的序列,每个节点有两个部分:节点值和指向下一个节点的指针。删除节点后,链表的结构应该保持完整。
方法 1:使用双指针法
思路
- 设置两个指针
使用两个指针
first
和second
,初始时它们都指向链表的头节点。 - 移动第一个指针
首先让
first
指针向后移动 K 个节点。 - 移动两个指针
接下来,同步移动
first
和second
,直到first
到达链表的末尾。此时,second
指针指向的节点就是待删除节点的前一个节点。 - 删除节点
通过更改指针的连接,跳过该节点,达到删除的效果。
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
def removeNthFromEnd(head: ListNode, n: int) -> ListNode:
dummy = ListNode(0)
dummy.next = head
first = dummy
second = dummy
# Move first n+1 steps ahead
for _ in range(n + 1):
first = first.next
# Move first to the end, maintaining the gap
while first:
first = first.next
second = second.next
# Skip the desired node
second.next = second.next.next
return dummy.next
时间复杂度
- O(L)
L 是链表的长度,因为我们需要遍历整个链表。
空间复杂度
- O(1)
只使用了常数级别的额外空间。
方法 2:计算链表长度
思路
- 遍历计算长度
首先遍历一次链表,计算出链表的长度。
- 确定要删除的节点位置
根据链表长度和 K 值,找到需要删除节点的前一个节点。
- 再遍历一次
再次遍历链表,找到该节点并修改指针。
def removeNthFromEnd(head: ListNode, n: int) -> ListNode:
length = 0
current = head
# Calculate the length of the ListNode
while current:
length += 1
current = current.next
# If n is equal to the length, we need to remove the head
if n == length:
return head.next
current = head
# Find the node before the one we want to remove
for _ in range(length - n - 1):
current = current.next
current.next = current.next.next # Remove the nth node from end
return head
时间复杂度
- O(L)
同样是遍历链表两次,所以时间复杂度是 O(L)。
空间复杂度
- O(1)
只使用了常数的额外空间。
总结
两种方法都可以有效地删除链表中倒数第 K 个元素。第一种方法利用双指针的灵活性,避免了再一次遍历的过程;而第二种方法则直观地通过计算长度来找到目标节点。两种方法在时间复杂度和空间复杂度上都是高效的,具体选择可根据实现的需求和个人习惯。
最后: 下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取【保证100%免费】