单链表结构
单链表结构原理比较简单,主要是编程时指针位置容易搞混。
另:不能像列表一样可以按下标查找,单链表只能顺序遍历查找。
如上图所示,节点由数据域和指针域构成,当前指针的next指向下一个元素的指针域,val(图中的elem)指向当前的元素值,节点定义如下:
# 定义节点
class Node(object):
def __init__(self,val,p=0):
self.val = val
self.next = p
一个个节点连起来,即构成了单链表,而也正是这样的原因,我们只要知道一个链表的首个元素的指针,即可以知道整个链表的元素和指针。
解题时,如下图所示,一般需要知道三个地方的指针,前一个指针prev,当前指针curr,下一个指针Next(curr.next),题目一般是需要改变这三个指针的位置,达到反转链表、删除链表某元素等的目的。
而一般头节点会变动的情况,则可能需要设置虚拟节点,让它指向head节点,虚拟节点没有元素值。
dummy_node = ListNode(-1) # 定义一个虚拟节点
dummy_node.next = head
LeeCode上的单链表题目分享
主要是注意表头的前一节点、当前节点、后一节点的变化关系,一般如果需要前一节点指向头节点,则需要设置一个虚拟节点,即prev.next=head,从而使head前面有一个虚拟节点连接
1. 206 反转链表、剑指offer 24 反转链表
# 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:
prev = None
curr = head
while curr :
Next = curr.next
curr.next = prev
prev = curr
curr = Next
return prev
2. 203 移除列表元素、剑指offer18
这里主要注意的是,由于移除操作没有改变curr指针指向的下一个元素,即没有改变curr.next,因此不需要创建Next变量存储curr.next。
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
<