链表常见操作总结
1. 链表的定义
单链表节点定义
class ListNode : def __init__ ( self, val= 0 , next = None ) : self. val = valself. next = next
双向链表节点定义
class DoublyListNode : def __init__ ( self, val= 0 , prev= None , next = None ) : self. val = valself. prev = prevself. next = next
2. 链表基本操作
1 插入节点
头插法
def insert_at_head ( head, val) : new_node = ListNode( val) new_node. next = headreturn new_node
尾插法
def insert_at_tail ( head, val) : new_node = ListNode( val) if not head: return new_nodecur = headwhile cur. next : cur = cur. next cur. next = new_nodereturn head
2 删除节点
删除指定值的节点
def delete_node ( head, val) : dummy = ListNode( 0 ) dummy. next = headprev, cur = dummy, headwhile cur: if cur. val == val: prev. next = cur. next break prev, cur = cur, cur. next return dummy. next
3 反转链表
反转整个链表
def reverse_list ( head) : prev, cur = None , headwhile cur: next_node = cur. next cur. next = prevprev = curcur = next_nodereturn prev
反转长度为k的链表(k个一组反转链表)
def reverseKGroup ( head, k) : temp, count = head, 0 while temp and count < k: temp = temp. next count += 1 if count < k: return headprev, curr = None , headfor _ in range ( k) : next_node = curr. next curr. next = prevprev = currcurr = next_nodehead. next = reverseKGroup( curr, k) return prev
4 快慢指针
查找中间节点
def find_middle ( head) : slow, fast = head, headwhile fast and fast. next : slow = slow. next fast = fast. next . next return slow
检测链表是否有环
def has_cycle ( head) : slow, fast = head, headwhile fast and fast. next : slow = slow. next fast = fast. next . next if slow == fast: return True return False
找到环的起点
def detect_cycle ( head) : slow, fast = head, headwhile fast and fast. next : slow = slow. next fast = fast. next . next if slow == fast: ptr = headwhile ptr != slow: ptr = ptr. next slow = slow. next return ptr return None
5 其他
合并两个有序链表
def merge_two_lists ( l1, l2) : dummy = ListNode( 0 ) cur = dummywhile l1 and l2: if l1. val < l2. val: cur. next , l1 = l1, l1. next else : cur. next , l2 = l2, l2. next cur = cur. next cur. next = l1 if l1 else l2return dummy. next
分割链表
def splitList ( head, size) : cur = headfor _ in range ( size - 1 ) : if cur is None : break cur = cur. next if cur is None or cur. next is None : return None next_head = cur. next cur. next = None return next_head
判断两个链表是否相交
def get_intersection_node ( headA, headB) : if not headA or not headB: return None a, b = headA, headBwhile a != b: a = a. next if a else headBb = b. next if b else headAreturn a