链表基础理论
讲解
链表的定义
# 单链表
class node:
def __init__(self, data=None):
self.data=data
self.next=None
# 双向链表
class node:
def __init__(self, data=None):
self.data=data
self.prev=None
self.post=None
链表的链接
# 单链表
node1=node(1)
node2=node(2)
node3=node(3)
node1.next=node2
node2.next=node3
# 双向链表
node1=node(1)
node2=node(2)
node3=node(3)
node1.post=node2
node2.post=node3
node2.prev=node1
node3.prev=node2
# 循环链表
node1=node(1)
node2=node(2)
node3=node(3)
node1.next=node2
node2.next=node3
node3.next=node1
链表的遍历
while node !=None:
print(node.val)
node=node.next
题目
203移除链表元素
题目链接:203. 移除链表元素 - 力扣(LeetCode)
题目难度:简单
完成状态:看完讲解自己写出来
完成时间:讲解+代码 20min
感受:注意链表遍历和数组遍历的代码区别。数组是位置加一,链表是用.next
707.设计链表
题目难度:中等
完成状态:看完讲解自己写出来
完成时间:讲解+代码 30min
感受:注意增加和删除节点是遍历到该节点的上一个,获取节点值是遍历到该节点
206.反转链表
题目难度:简单
完成状态:看完讲解自己写出来
完成时间:讲解+代码 20min
注意看代码里注释的感想
双指针法:注意数组/列表中的双指针是定义成位置下标,链表中是定义为节点本身(node)
# 双指针法
# 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
prev=None#因为头结点最后要指向None
while cur:#思考循环结束的时候可以思考最后一个节点是什么情况,或者最后一个节点的下一个节点是什么情况
temp=cur.next
cur.next=prev
prev=cur
cur=temp
return prev #注意结束的时候谁才是头结点
递归法就是双指针法的改编
# 递归法
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def reverse(self,cur,prev):
if cur==None:
return prev
else:
temp=cur.next
cur.next=prev
prev=cur
cur=temp
return self.reverse(cur,prev)
def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:
return self.reverse(head,None)