链表2-->练习题

题目1:移除链表元素

在题目图中,给出的是头节点,但是我们知道头节点的话就相当于知道了整个链表,所以示例中给出了整个列表。 

解题思路: 

遍历整个链表的节点,遇到相同的值便将节点指针指向下一个节点。

上边这个方法是根据前一个节点的指针来删除节点的,那么如果要删除的值是第一个节点的值呢?第一个节点并没有前一个节点那么这个怎么删除?

有两种解决方法:

  • 删除的是头节点的话,另外写一种情况。
  • 在头节点前定义一个虚拟节点,其指针指向头节点。
解法一:定义一个虚拟节点
# 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_node=ListNode(next=head)
        current=dummy_node
        while current.next:
            if current.next.val==val:
                current.next=current.next.next # 如果下一个节点是要删除的节点,那么将当前节点指针指向下下个节点。
            else:
                current=current.next
        return dummy_node.next

注意:

最开始写的时候我有一个误区,最后return的不是dummy_node.next,而是current.next,然后就报错了。这是因为最开始的时候current=dummy_node,之后对current进行遍历删除,那么这个过程中也是对dummy_node遍历删除,dummy_node也会做出相应的改变,但是循环到最后一个节点的时候,current指向的是最后一个链表的节点了,如果返回current.next,就没办法找到整个链表了。(链表要根据头节点才能找到),所以还是返回链表的头节点dummy_node.next,这样才能找到整个链表。

时间复杂度:o(n),因为遍历了整个链表。

空间复杂度:o(1)。

题目二:设计链表。

实现根据下标索引返回链表元素节点,增加、删除链表节点。

题解:
class ListNode:  # 创建一个链表
    def __init__(self,val=0,next=None):
        self.val=val
        self.next=next

class MyLinkedList:

    def __init__(self):
        self.dummy_head=ListNode()  # 这里创建的dummy_head只是一个节点,目前后边什么都没有。
        self.size=0  # 该值表示的是链表的长度
        
    def get(self, index: int) -> int:   # 这里通过下标索引为什么要创建一个虚拟的节点
        if index < 0 or index >= self.size:
            return -1
        current = self.dummy_head.next
        for i in range(index):
            current=current.next
            
            
        return current.val

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


    def addAtTail(self, val: int) -> None:
        current=self.dummy_head
        # while current.next:
        # for i in range(self.size):
        #     current=current.next
        # current.next=ListNode(val)
        # self.size+=1
        # return self.dummy_head.next
        current = self.dummy_head
        while current.next:  # 
            current = current.next
        current.next = ListNode(val)
        self.size += 1
 

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


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

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值