一、203移除链表元素
一道简单链表题,需要注意的点为:
- 如果链表原来的头结点为需要删除的结点,应该怎么办?
- 如果移除完之后链表为空,那么应该返回的结点是哪一个?
为了解决这两个问题,可以构造一个虚拟头结点:dummy_head
虚拟头结点的val不重要,虚拟头结点的next指针指向原有的头结点。那么在删除的过程中,遇到情况1,就可以用虚拟头结点直接指向head.next
来简单地解决该问题;遇到情况2,就可以返回dummy_head.next
具体代码如下:
# 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_head = ListNode(next = head)
ptr = dummy_head
while ptr.next != None:
if ptr.next.val == val:
ptr.next = ptr.next.next
else:
ptr = ptr.next
return dummy_head.next
二、设计链表
个人很讨厌这些设计题,所以一般都会跳过(因为本科和考研的时候伪代码已经写吐了,如果对链表的增删查改不是很熟悉,还是值得一写的)
leetcode 707 设计链表
三、反转链表
反转链表也需要通过虚拟头节点进行
可以通过链表头插法进行快速的原地链表反转
具体代码如下
# 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]:
dummyHead = ListNode(next = None)
cur_ptr = head
while cur_ptr:
tmp_ptr = dummyHead.next
dummyHead.next = cur_ptr
cur_ptr = cur_ptr.next
dummyHead.next.next = tmp_ptr
return dummyHead.next