剑指 Offer 18. 删除链表的节点
给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。
返回删除后的链表的头节点。
注意:此题对比原题有改动
双指针:
def deleteNode(self, head: ListNode, val: int) -> ListNode:
cur = head.next
pre = head
if pre.val == val: return cur
while cur.next:
if cur.val == val:
pre.next = cur.next
pre = cur
cur = cur.next
if cur.val == val: pre.next = None
return head
大佬思路和代码:
class Solution:
def deleteNode(self, head: ListNode, val: int) -> ListNode:
if head.val == val: return head.next
pre, cur = head, head.next
while cur and cur.val != val:
pre, cur = cur, cur.next
if cur: pre.next = cur.next
return head
剑指 Offer 22. 链表中倒数第k个节点
输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。
例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。
双指针:
def getKthFromEnd(self, head: ListNode, k: int) -> ListNode:
pre = cur = head
for i in range(k):
cur = cur.next
while cur:
pre, cur = pre.next, cur.next
return pre
让cur先运动k个节点,然后pre和cur同步往后移动,直到cur指向NULL时,返回pre指向节点即可。
下面是大佬的思路和代码:
class Solution:
def getKthFromEnd(self, head: ListNode, k: int) -> ListNode:
former, latter = head, head
for _ in range(k):
former = former.next
while former:
former, latter = former.next, latter.next
return latter
和大佬 的代码一样。看来思路和简介代码模仿的有点模样了。