链表
今天开始链表,算是二刷吧!
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 的。
在这里插入代码片
题目描述:给你单链表的头节点 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个小时,遇到链表题,还是要画图,比较直观!