难度简单
给你一个链表的头节点 head
和一个整数 val
,请你删除链表中所有满足 Node.val == val
的节点,并返回 新的头节点 。
示例 1:
输入:head = [1,2,6,3,4,5,6], val = 6 输出:[1,2,3,4,5]
示例 2:
输入:head = [], val = 1 输出:[]
示例 3:
输入:head = [7,7,7,7], val = 7 输出:[]
提示:
- 列表中的节点数目在范围
[0, 104]
内 1 <= Node.val <= 50
0 <= val <= 50
记录:
好吧我不会链表,更没做过链表的题,看了几遍基础知识,感觉核心就是各种操作指针,理解和用起来还蛮费劲的。
from typing import List, Optional
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]:
pre = ListNode()
pre.next = head
p = head
#这部分代码中,创建了一个新的节点 pre,将其指向头结点 head,同时定义了变量 p,用来遍历整个链表。
while p != None:
if p.val == val:
pre.next = p.next
p = p.next
else:
pre = p
p = p.next
#这部分代码中,遍历整个链表,并根据每个节点的值是否等于 val 进行相应的处理。
#如果当前节点的值等于 val,那么将 pre 节点的 next 指针指向 p 的下一个节点,然后继续用 p 的下一个节点更新 p。
#如果当前节点的值不等于 val,我们将 pre 更新为当前节点,然后继续遍历到下一个节点。
while head != None:
if head.val == val:
head = head.next
else:
return head
return head
#这部分代码中,用来删除头结点的值等于 val 的情况。因为在上面的代码中,使用 pre 节点来处理删除非头结点的情况,所以需要使用另外一个循环来处理删除头结点的情况。
#如果头结点的值等于 val,那么将头结点指向下一个节点,然后继续判断下一个节点的值是否等于 val,以删除所有头结点的值等于 val 的节点。如果头结点的值不等于 val,那么直接返回头结点,最后返回删除后的结果链表。
n = [int(x) for x in input().split(",")]
z = int(input())
data = n
head = ListNode(data[0])
node = head
for val in data[1:]:
node.next = ListNode(val)
node = node.next
result = Solution().removeElements(head, z)
while result:
print(result.val, end=" ")
result = result.next
没吃透,自己写不出来,只能先精读一下别人的代码。
题目:
难度中等
你可以选择使用单链表或者双链表,设计并实现自己的链表。
单链表中的节点应该具备两个属性:val
和 next
。val
是当前节点的值,next
是指向下一个节点的指针/引用。
如果是双向链表,则还需要属性 prev
以指示链表中的上一个节点。假设链表中的所有节点下标从 0 开始。
实现 MyLinkedList
类:
MyLinkedList()
初始化MyLinkedList
对象。int get(int index)
获取链表中下标为index
的节点的值。如果下标无效,则返回-1
。void addAtHead(int val)
将一个值为val
的节点插入到链表中第一个元素之前。在插入完成后,新节点会成为链表的第一个节点。void addAtTail(int val)
将一个值为val
的节点追加到链表中作为链表的最后一个元素。void addAtIndex(int index, int val)
将一个值为val
的节点插入到链表中下标为index
的节点之前。如果index
等于链表的长度,那么该节点会被追加到链表的末尾。如果index
比长度更大,该节点将 不会插入 到链表中。void deleteAtIndex(int index)
如果下标有效,则删除链表中下标为index
的节点。
示例:
输入 ["MyLinkedList", "addAtHead", "addAtTail", "addAtIndex", "get", "deleteAtIndex", "get"] [[], [1], [3], [1, 2], [1], [1], [1]] 输出 [null, null, null, null, 2, null, 3] 解释 MyLinkedList myLinkedList = new MyLinkedList(); myLinkedList.addAtHead(1); myLinkedList.addAtTail(3); myLinkedList.addAtIndex(1, 2); // 链表变为 1->2->3 myLinkedList.get(1); // 返回 2 myLinkedList.deleteAtIndex(1); // 现在,链表变为 1->3 myLinkedList.get(1); // 返回 3
提示:
0 <= index, val <= 1000
- 请不要使用内置的 LinkedList 库。
- 调用
get
、addAtHead
、addAtTail
、addAtIndex
和deleteAtIndex
的次数不超过2000
。
(版本一)单链表法
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
current = self.dummy_head.next
for i in range(index):
current = current.next
return current.val
def addAtHead(self, val: int) -> None:
self.dummy_head.next = ListNode(val, self.dummy_head.next)
self.size += 1
def addAtTail(self, val: int) -> None:
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
current.next = ListNode(val, current.next)
self.size += 1
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
正在试图理解,这里贴一下卡尔哥的代码和代码随想录的链接,明后天周末要再好好过一下这部分。
题目:
难度简单
给你单链表的头节点 head
,请你反转链表,并返回反转后的链表。
示例 1:
输入:head = [1,2,3,4,5] 输出:[5,4,3,2,1]
示例 2:
输入:head = [1,2] 输出:[2,1]
示例 3:
输入:head = [] 输出:[]
提示:
- 链表中节点的数目范围是
[0, 5000]
-5000 <= Node.val <= 5000
进阶:链表可以选用迭代或递归方式完成反转。你能否用两种方法解决这道题?
记录:
哎,又是挫败的一天