第 11 天
双指针 Two-pointer Tech
这道题非常典型的链表双指针,为了出来头节点数据我们设置一个虚拟头节点,node变量用于遍历Linklist,如果发现node.next == val,将node.next.next 设置为node.next,若不存在node.next.next,将None设置为node.next,最后返回虚拟头节点.next 即可
class Solution:
def deleteNode(self, head: ListNode, val: int) -> ListNode:
fake_head = ListNode(None)
fake_head.next = head
node = fake_head
while node.next :
if node.next.val == val:
if node.next.next:
node.next = node.next.next
else:
node.next = None
break
node = node.next
return fake_head.next
这道题我的思路首先遍历链表算出链表长度n,然后二次遍历链表返回n-k出的节点即为所得链表
class Solution:
def getKthFromEnd(self, head: ListNode, k: int) -> ListNode:
node = head
n = 1
while node.next:
n += 1
node = node.next
m = n-k
new_node = head
for _ in range(m):
new_node = new_node.next
return new_node
虽然这个方法时间空间复杂都很低但是我们发现一个问题,就是没有用到双指针。
双指针思路如下
我们设置left指针在head处,right在head后面k的位置,然后left和right同时右移,当right为最后一个节点是,left为所求节点
class Solution:
def getKthFromEnd(self, head: ListNode, k: int) -> ListNode:
left = head
right = head
for _ in range(k-1):
right = right.next
while right.next:
left = left.next
right = right.next
return left
发现用时明显高于第一种方法,实际这个是测试用例的原因,当链表十分十分长时,遍历两遍的用时要明显长于快慢指针的遍历一遍用时