2024/11/25 LeetCode707.设计链表

解法一:单链表解法

 1 #单链表法
 2 class ListNode:
 3     def __init__(self, val=0, next=None):
 4         self.val = val
 5         self.next = next
 6 
 7 class MyLinkedList:
 8 
 9     def __init__(self):
10         '''初始化 MyLinkedList 对象'''
11         self.dummy_head = ListNode()
12         self.size = 0 
13     
14     def get(self, index: int) -> int:
15         '''获取链表中下标为 index 的节点的值。如果下标无效,则返回 -1 。'''
16         if index < 0 or index >= self.size:
17             return -1
18         
19         current = self.dummy_head.next
20         for i in range(index):
21             current = current.next
22         
23         return current.val
24 
25     def addAtHead(self, val: int) -> None:
26         '''将一个值为 val 的节点插入到链表中第一个元素之前。'''
27         self.dummy_head.next = ListNode(val, self.dummy_head.next)
28         self.size += 1
29         return
30 
31     def addAtTail(self, val: int) -> None:
32         '''将一个值为 val 的节点追加到链表中作为链表的最后一个元素。'''
33         current = self.dummy_head
34         while current.next:
35             current = current.next
36         current.next = ListNode(val)
37         self.size += 1
38         return 
39 
40     def addAtIndex(self, index: int, val: int) -> None:
41         '''将一个值为 val 的节点插入到链表中下标为 index 的节点之前。
42         如果 index 等于链表的长度,那么该节点会被追加到链表的末尾。
43         如果 index 比长度更大,该节点将 不会插入 到链表中。'''
44         if index < 0 or index > self.size:
45             return
46     
47         current = self.dummy_head
48         for i in range(index):
49             current = current.next
50         current.next = ListNode(val, current.next)
51         self.size += 1
52         return
53             
54     def deleteAtIndex(self, index: int) -> None:
55         '''如果下标有效,则删除链表中下标为 index 的节点'''
56         if index < 0 or index >= self.size:
57             return
58         
59         current = self.dummy_head
60         for i in range(index):
61             current = current.next
62         current.next = current.next.next
63         self.size -= 1
64         return

解法二:双链表解法

代码随想录给的解法,比较复杂。如下的解法在解法一上更改,更简便。

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

class MyLinkedList:

    def __init__(self):
        '''初始化 MyLinkedList 对象'''
        self.dummy_head = ListNode()
        self.size = 0 
    
    def get(self, index: int) -> int:
        '''获取链表中下标为 index 的节点的值。如果下标无效,则返回 -1 。'''
        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:
        '''将一个值为 val 的节点插入到链表中第一个元素之前。'''
        AddNode = ListNode(val, self.dummy_head, self.dummy_head.next)
        if self.dummy_head.next:
            self.dummy_head.next.pre = AddNode
        self.dummy_head.next = AddNode
        self.size += 1
        return

    def addAtTail(self, val: int) -> None:
        '''将一个值为 val 的节点追加到链表中作为链表的最后一个元素。'''
        current = self.dummy_head
        while current.next:
            current = current.next
        AddNode = ListNode(val, current)
        current.next = AddNode
        self.size += 1
        return 

    def addAtIndex(self, index: int, val: int) -> None:
        '''将一个值为 val 的节点插入到链表中下标为 index 的节点之前。
        如果 index 等于链表的长度,那么该节点会被追加到链表的末尾。
        如果 index 比长度更大,该节点将 不会插入 到链表中。'''
        if index < 0 or index > self.size:
            return
    
        current = self.dummy_head
        for i in range(index):
            current = current.next
        AddNode = ListNode(val, current, current.next)
        if current.next:
            current.next.pre = AddNode
        current.next = AddNode
        self.size += 1
        return
            
    def deleteAtIndex(self, index: int) -> None:
        '''如果下标有效,则删除链表中下标为 index 的节点'''
        if index < 0 or index >= self.size:
            return
        
        current = self.dummy_head
        for i in range(index):
            current = current.next
        if current.next.next:
            current.next.next.pre = current
        current.next = current.next.next
        self.size -= 1
        return

 

posted on 2024-11-25 19:19  axuu  阅读(28)  评论(0)    收藏  举报