707. 设计链表之解题思路

707. 设计链表之解题思路

在这里插入图片描述

一、思路

1、注意事项:链表的设计其中最关键要区分的是链表长度 size 和索引值 index 的关系(见下图),尤其是添加节点时需要考虑到索引值为0时和链表长度为0(链表为空)时的设计
在这里插入图片描述
2、链表节点插入函数情况分类讨论:(为什么要单独考虑链表为空和索引值为0的情况呢?因为在博主的代码设计中循环终止条件是索引值减去1,终止条件不能为负数。)

  • 索引值小于0
  • 索引值大于链表长度(无效插入)
  • 索引值等于链表长度(链表为空;链表不为空
  • 索引值小于链表长度(索引值为0;索引值不为0

3、参考文章点击打开《数据结构基本算法(python版本)》文章了解python链表结构的设计

# 设计一个通用链节点的类
class ListNode:
    def __init__(self,val=0,next=None):
        self.val = val
        self.next = next
# 设计链表的类
class MyLinkedList:

    def __init__(self): # 链表初始化
        self.size = 0 # 链表长度
        self.head = ListNode(0) # 头节点

    def get(self, index: int) -> int:
        if index < 0 or index >= self.size: # 索引无效,获取链表节点值时链表值不能等于链表长度,但是下面插入函数可以请注意
            return -1
        else:
            temp = self.head
            for _ in range(index):
                temp = temp.next
            return temp.val

    def addAtHead(self, val: int) -> None:
        self.addAtIndex(-1,val)


    def addAtTail(self, val: int) -> None:
        self.addAtIndex(self.size,val)


    def addAtIndex(self, index: int, val: int) -> None:
        if index < 0: # 索引值小于0,在链表头部插入节点
            tail = self.head
            temp = ListNode(val)
            temp.next = tail
            self.head = temp
            self.size += 1
        elif index > self.size: # 索引值大于链表长度,无效
            pass
        elif index == self.size: # 索引值等于链表长度
            if self.size == 0: # 链表为空,直接在头部插入
                tail = self.head
                temp = ListNode(val)
                temp.next = tail
                self.head = temp
                self.size += 1
            else: # 链表不为空,链节点插入链表尾部
                tail = self.head
                temp = ListNode(val)
                for _ in range(index-1):
                    tail = tail.next
                tail.next = temp
                self.size += 1
        else: # 索引值不等于链表长度
            if index == 0: # 索引值为0,在链表头部插入链节点
                tail = self.head
                temp = ListNode(val)
                temp.next = tail
                self.head = temp
                self.size += 1
            else: # 索引值不为0,在index的节点之前插入新的链节点
                tail = self.head
                for _ in range(index-1):
                    tail = tail.next
                temp = ListNode(val)
                temp.next = tail.next
                tail.next = temp
                self.size += 1


    def deleteAtIndex(self, index: int) -> None:
        if index >= 0 and index < self.size: # 索引值有效的情况下进行链节点删除
            if index == 0: # 删除头节点
                self.head = self.head.next
                self.size -= 1
            elif index == self.size - 1: # 删除尾节点
                tail = self.head
                for _ in range(self.size - 2):
                    tail = tail.next
                tail.next = None
                self.size -= 1
            else: # 删除中间节点
                tail = self.head
                for _ in range(index-1):
                    tail = tail.next
                temp = tail.next.next
                tail.next = temp
                self.size -= 1


# Your MyLinkedList object will be instantiated and called as such:
# obj = MyLinkedList()
# param_1 = obj.get(index)
# obj.addAtHead(val)
# obj.addAtTail(val)
# obj.addAtIndex(index,val)
# obj.deleteAtIndex(index)

猜你喜欢

转载自blog.csdn.net/rothschild666/article/details/129418598