代码随想录算法训练营No3 |LeetCode203.移除链表元素 ● 707.设计链表 ● 206.反转链表

链表

今天开始链表,算是二刷吧!

203.移除链表元素
题目描述:给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点。

为了头结点,先初始化一个dummy节点指向头结点,这样头结点就可以和其他节点一样操作了。

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def removeElements(self, head: Optional[ListNode], val: int) -> Optional[ListNode]:
        dummy = ListNode(next=head)
        cur = dummy
        while cur.next!=None:
            if cur.next.val == val:
                cur.next = cur.next.next
            else:
                cur = cur.next

        return dummy.next

707.设计链表
题目描述:设计链表的实现。您可以选择使用单链表或双链表。单链表中的节点应该具有两个属性:val 和 next。val 是当前节点的值,next 是指向下一个节点的指针/引用。如果要使用双向链表,则还需要一个属性 prev 以指示链表中的上一个节点。假设链表中的所有节点都是 0-index 的。

在这里插入代码片

206.反转链表

题目描述:给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

只需要改变链表的next指针的指向,直接将链表反转 ,而不用重新定义一个新的链表

  • cur指针初始为head节点
  • pre指针定义为一个null节点
  • 修改cur.next指向pre
  • pre 、cur 指针右移一位,
  • 循环直至cur为空,此时返回pre
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:
        cur = head
        pre = None
        
        while cur:
            tmp = cur.next  # 保存cur.next,因为接下里要修改cur指向
            cur.next = pre # 修改指向
            pre = cur # pre右移
            cur = tmp # cur 右移

        return pre

递归法:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def reverseList(self, head: ListNode) -> ListNode:
        
        def reverse(pre,cur):
            if not cur:
                return pre
                
            tmp = cur.next
            cur.next = pre

            return reverse(cur,tmp)
        
        return reverse(None,head)

今天感觉链表时间长了忘了,还是不熟啊,花了2个小时,遇到链表题,还是要画图,比较直观!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值