Day03 链表
1. 链表理论基础
链表类型:
- 单链表:最后一个节点的指针指向null
- 双链表:每一个节点有两个指针,一个指向后一个节点,一个指向前一个节点
- 循环链表:链表收尾相连(约瑟夫环问题)
存储:
数组:连续;链表:不连续
链表的定义:手撕代码可能会写
python 定义一个节点类,每次使用实例化
class Listcode:
def __init__(self,val,next=None):
self.val = val
self.next = next
链表操作:
删除:只要将next指针 指向下下一个就可以了。Python有自己的内存回收机制,不用自己手动释放。
添加:上一个next指针指向新节点,新节点的next指针指向上一个节点的原next节点
增添和删除都是O(1)操作
2. 移除链表元素 -(虚拟头结点)
题目:
设置一个虚拟头结点,统一所有节点的处理方式,这样原链表的所有节点就都可以按照统一的方式进行移除了。
# 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]:
if not head: return None
fake_head = ListNode(next = head)
cur = fake_head
while cur.next:
if cur.next.val == val:
cur.next = cur.next.next
else:
cur = cur.next
return fake_head.next
3. 设计链表
题目:
有空复盘,有点绕
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
cur = self.dummy_head.next
for i in range(index):
cur = cur.next
return cur.val
def addAtHead(self, val: int) -> None:
new = ListNode(val,self.dummy_head.next)
self.dummy_head.next = new
self.size += 1
def addAtTail(self, val: int) -> None:
cur = self.dummy_head
while cur.next:
cur = cur.next
cur.next = ListNode(val)
self.size +=1
def addAtIndex(self, index: int, val: int) -> None:
if index<0 or index > self.size: return
cur = self.dummy_head
for i in range(index):
cur = cur.next
cur.next = ListNode(val,cur.next)
self.size+=1
def deleteAtIndex(self, index: int) -> None:
if index<0 or index >= self.size: return
cur = self.dummy_head
for i in range(index):
cur = cur.next
cur.next = cur.next.next
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)
4. 反转链表
题目:
# 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]:
if not head: return None
cur = head
pre = None
while cur:
temp = cur.next
cur.next = pre
pre = cur
cur = temp
return pre