「代码随想录」Python刷题笔记Day3-链表专题

链表第一天

    • 链表基础
    • 203. 移除链表元素
    • 707.设计链表
    • 206. 翻转链表

链表基础

链接

203. 移除链表元素

链接
leetcode-203
【题目】
给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。
「代码随想录」Python刷题笔记Day3-链表专题_第1张图片

class ListNode:
	def __init__(self, val, next=None):
		self.val=val
		self.next=next

class Solution:
    def removeElements(self, head: ListNode, val: int) -> ListNode:
		dummyNode = ListNode(0, next=head)
		current = dummyNode
		
		while current.next:
			if current.next.val == val:
				current.next = next.next
			else:
				current = current.next
		return dummyNode.next

注:

  1. 一般地,我们只需要检查next.val==target,并将next指向next.next就好;但是头节点的删除需要额外将head指向第二个节点,并将头节点删除;
  2. 为了避免专门为头节点写一段代码,我们可以添加一个虚拟的头节点dummy node,使其指向原始的头节点,如此一来就可以按照统一的方式操作所有的节点了;
  3. while后面的条件需要判断current.next,否则当current为最后一个节点的时候没有next;
  4. 时间复杂度O(n),空间复杂度O(1).

707.设计链表

leetcode-707
【题目】
在链表类中实现这些功能:
get(index):获取链表中第 index 个节点的值。如果索引无效,则返回-1。
addAtHead(val):在链表的第一个元素之前添加一个值为 val 的节点。插入后,新节点将成为链表的第一个节点。
addAtTail(val):将值为 val 的节点追加到链表的最后一个元素。
addAtIndex(index,val):在链表中的第 index 个节点之前添加值为 val 的节点。如果 index 等于链表的长度,则该节点将附加到链表的末尾。如果 index 大于链表长度,则不会插入节点。如果index小于0,则在头部插入节点。
deleteAtIndex(index):如果索引 index 有效,则删除链表中的第 index 个节点。

考察对于链表的理解,此处利用了dummy head

先写个单链表:

# 单链表
class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

class MyLinkedList:
    def __init__(self):
        self.dummyHead = ListNode()
        self.size = 0

    def get(self, index: int) -> int:
        if index<0 or index>=self.size:
            return -1
        # 因为首个元素的下标index=0,所以current从首个元素开始
        # 边界考虑-举极端案例
        current = self.dummyHead.next
        for i in range(index):
            current = current.next
        return current.val

    def addAtHead(self, val: int) -> None:
        self.dummyHead.next = ListNode(val, self.dummyHead.next)
        self.size += 1

    def addAtTail(self, val: int) -> None:
        current = self.dummyHead
        while current.next:
            current = current.next
        # 遍历完当前链表内的所有元素后,添加next
        current.next = ListNode(val)
        self.size += 1

    def addAtIndex(self, index: int, val: int) -> None:
        if index<0 or index > self.size: # 第n个节点前
            return 
        current = self.dummyHead
        for i in range(index):
            current = current.next
        current.next = ListNode(val, next=current.next)
        self.size += 1


    def deleteAtIndex(self, index: int) -> None:
        if index<0 or index>=self.size:
            return 
        current = self.dummyHead
        for i in range(index):
            current = current.next
        current.next = current.next.next
        self.size -= 1

双链表的写法后续补充。

206. 翻转链表

链接
leetcode-206
【题目】
题意:反转一个单链表。
示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL

class Solution:
    def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:
        cur = head
        pre = None
        while cur:
            nex = cur.next
            cur.next = pre
            pre = cur
            cur = nex
        return pre

你可能感兴趣的:(代码随想录,链表,python,笔记)