找链表的中点:
- 五个节点中间节点找
33+2 - 四个节点中间节点找
22+2
需要 slow 从 head 出发,fast 从 head.next 出发。
while 循环的时候需要判断 fast and fast.next
21. 合并两个有序链表 - 找链表的中点slow,fast=head,head.nextwhile fast and fast.next:fast,slow=fast.next.next,slow.nextslow.next,mid=None,slow.next
归并排序两个链表
# Definition for singly-linked list.# class ListNode:# def __init__(self, x):# self.val = x# self.next = Noneclass Solution:def sortList(self, head: ListNode) -> ListNode:if not head or not head.next:return head# Cutslow,fast=head,head.nextwhile fast and fast.next:fast,slow=fast.next.next,slow.nextslow.next,mid=None,slow.next# Recursionleft,right=self.sortList(head),self.sortList(mid)# Mergeh=res=ListNode(0)while left and right:if left.val<right.val:h.next,left=left,left.nextelse:h.next,right=right,right.nexth=h.nexth.next=left if left else rightreturn res.next
链表逆序
def reverse(self, head):pre = Nonecurr = headwhile curr:nextNode = curr.nextcurr.next = prepre = currcurr = nextNodereturn pre
双向链表
双向链表的定义
struct doubleLinkedNode {int key, value;doubleLinkedNode* prev;doubleLinkedNode* next;doubleLinkedNode() :key(0), value(0), prev(nullptr), next(nullptr) {};doubleLinkedNode(int _key, int _value) :key(_key), value(_value), prev(nullptr), next(nullptr) {};};
头节点后面添加 / 删除节点 / 尾节点前面删除 / 移动节点到头部
void addToHead(doubleLinkedNode* node) {node->prev = head;node->next = head->next;head->next->prev = node;head->next = node;}void removeNode(doubleLinkedNode* node) {node->prev->next = node->next;node->next->prev = node->prev;}void moveToHead(doubleLinkedNode* node) {removeNode(node);addToHead(node);}doubleLinkedNode* removeTail() {doubleLinkedNode* node = tail->prev;removeNode(node);return node;}
