单向链表:即前面介绍的普通链表。单向链表的节点包含值和指向下一节点的引用两项数据。我们将首个节点称为头节点,将最后一个节点称为尾节点,尾节点指向空 None
。
环形链表:如果我们令单向链表的尾节点指向头节点(首尾相接),则得到一个环形链表。在环形链表中,任意节点都可以视作头节点。
双向链表:与单向链表相比,双向链表记录了两个方向的引用。双向链表的节点定义同时包含指向后继节点(下一个节点)和前驱节点(上一个节点)的引用(指针)。相较于单向链表,双向链表更具灵活性,可以朝两个方向遍历链表,但相应地也需要占用更多的内存空间。
单向链表
class Node(object):
"""单链表节点类"""
def __init__(self, value, next=None):
self.value = value
self.next = next
双向链表
class ListNode(object):
"""双向链表节点类"""
def __init__(self, val=None, prev=None, next=None):
self.val = val # 节点值
self.next = next # 指向后继节点的引用
self.prev = prev # 指向前驱节点的引用
数组与链表的对比
链表习题巩固
LeetCode 19. 删除链表的倒数第 N 个结点
LeetCode 148. 排序链表
LeetCode 160. 相交链表
LeetCode 206. 反转链表
LeetCode 203.移除链表元素
LeetCode 707.设计链表
LeetCode 24.两两交换链表中的节点
LeetCode 142.环形链表II
我们在完成链表类题目的时候,同样可以考虑使用双指针(使用频率较高)进行解题,链表与数组之间有着不一样的思路,我们要尽量避免受到数组解决方式的影响。习题巩固中,我认为142环形链表是一道比较有意思的题目,其中的解决思路很值得我们去学习。