力扣刷题Day 3 | 203.移除链表元素,707.设计链表,206.反转链表

203.移除链表元素

题目链接

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

力扣刷题Day 3 | 203.移除链表元素,707.设计链表,206.反转链表_第1张图片

视频讲解

手把手带你学会操作链表 | LeetCode:203.移除链表元素_哔哩哔哩_bilibili

笔记

  1. 移除链表元素要分两种情况,一是要移除的元素为头节点,二是要移除的元素为非头节点。为了简化代码,定义一个虚拟头节点dummy_head = ListNode(next=head)
  2. 遍历从dummy_head开始,由于最后要返回链表的头指针,也就是dummy_head.next,所以遍历过程中不能修改头指针的值,而是将dummy_head复制给一个新节点current,让current承担遍历过程,每次current=current.next
  3. 如果遇到当前节点的下一个节点的值和目标值相同,则将当前节点的next改为下一个节点的next,实现删除下一个节点的功能

Python代码

#虚拟头节点法

class Solution:
    def removeElements(self, head: Optional[ListNode], val: int) -> Optional[ListNode]:
        # 创建虚拟头部节点以简化删除过程
        dummy_head = ListNode(next = head)
        
        # 遍历列表并删除值为val的节点
        current = dummy_head
        while current.next:
            if current.next.val == val:
                current.next = current.next.next
            else:
                current = current.next
        return dummy_head.next


707.设计链表

题目链接

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

视频讲解

帮你把链表操作学个通透!LeetCode:707.设计链表_哔哩哔哩_bilibili

笔记

  1. 要定义节点类ListNode,注意构造函数__init__(self)的格式,默认val=0,next=None
  2. 自定义链表类MyLinkedList的构造函数__init__(self)中需要定义一个虚拟头节点ListNode(),size为0
  3. 各方法中,若传入的下标参数index不合法,应当返回-1(删除节点时index的范围为[0,size-1],但添加节点时index的范围为[0,size]
  4. 对链表的节点进行删除或者添加操作后,要记得把size减一
  5. 遍历链表找节点的时候,注意边界条件,注意cur的初始值,最好画图简单验证一下特殊情况

Python代码

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

class MyLinkedList:

    def __init__(self):
        self.dummy_head = ListNode()
        self.size = 0


    def get(self, index: int) -> int:
        if index < 0 or index >= self.size:
            return -1

        cur = self.dummy_head.next
        for i in range(index):
            cur = cur.next

        return cur.val


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


    def addAtTail(self, val: int) -> None:
        cur = self.dummy_head
        for i in range(self.size):
            cur = cur.next
        cur.next = ListNode(val)
        self.size += 1  #每次对元素进校添加或者删除操作之后要记得更新size的值


    def addAtIndex(self, index: int, val: int) -> None:
        if index <0 or index > self.size:
            return
        cur = self.dummy_head
        for i in range(index):
            cur = cur.next
        cur.next = ListNode(val,cur.next)
        self.size += 1


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


206.反转链表

题目链接

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

视频讲解

帮你拿下反转链表 | LeetCode:206.反转链表 | 双指针法 | 递归法_哔哩哔哩_bilibili

笔记

  1. 画图,模拟过程,看边界条件等特殊情况
  2. 反转链表用双指针
  3. 定义一个遍历的指针cur,从head开始;再定义一个遍历指针pre作为cur的前一个;每次修改cur.next之前先把cur.next用一个临时指针tmp存起来,免得指针断了不能往后继续遍历了
  4. 移动双指针的时候先改pre的值,再改cur的值

Python代码

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

你可能感兴趣的:(算法刷题,算法,leetcode,python)