环形链表

2023-12-19T00:14:40.png
使用两个指针,一个指针走一步,一个指针走两步,如果存在环,则两个指针必然会相遇,否则不会,用python实现如下:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

def hasCycle(self, head: Optional[ListNode]) -> bool:
    if not head and not head.next:return False
    tail1 = head
    tail2 = head.next
    while tail1 and tail2:
        if tail1 == tail2:
            return True
        tail1 = tail1.next
        tail2 = tail2.next
        if tail2:
           tail2 = tail2.next
        else:
            return False
    return False

两数相加

2023-12-19T00:30:08.png
用python实现

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
def addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:
    head = None
    tail = None
    add = 0
    while l1!=None and l2!=None:
        val = l1.val + l2.val + add
        add = int(val / 10)
        val = val % 10
        if head == None:
            head = ListNode(val)
            tail = head
        else:
            temp = ListNode(val)
            tail.next = temp
            tail = tail.next
        l1 = l1.next
        l2 = l2.next
    # 因为l1和l2的节点数都大于等于1,所以此处head一定不为空
    while l1:
        val = l1.val + add
        add = int(val / 10)
        val = val % 10
        temp = ListNode(val)
        tail.next = temp
        tail = tail.next
        l1 = l1.next
    while l2:
        val = l2.val + add
        add = int(val / 10)
        val = val % 10
        temp = ListNode(val)
        tail.next = temp
        tail = tail.next
        l2 = l2.next
    #
    if add >0:
        temp = ListNode(add)
        tail.next = temp
    return head

反转链表 II

2023-12-20T14:56:07.png

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
def reverseBetween(self, head: Optional[ListNode], left: int, right: int) -> Optional[ListNode]:
    if left == right:return head
    start_node = None
    start_pre_node = None
    end_node = None
    end_next_node = None
    p = head
    i = 1
    pre = None
    while p and i<=right:
        print(p.val)
        if i < left:
            pre = p
            p = p.next
        elif i == left:
            start_pre_node = pre
            start_node = p
            pre = p
            p = p.next
        elif i == right:
            end_node = p
            end_next_node = p.next
            p.next = pre
        else :
            temp = p.next
            p.next = pre
            pre = p
            p = temp
        i += 1
    if start_pre_node:
        start_pre_node.next = end_node
    else:
        head = end_node
    start_node.next = end_next_node
    return head

K 个一组翻转链表

2023-12-20T15:31:28.png

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
def reverseKGroup(self, head: Optional[ListNode], k: int) -> Optional[ListNode]:
    if k == 1:return head
    p = head
    node_size = 0
    while p:
        p = p.next
        node_size += 1
    node_size = int(node_size/k) * k
    if node_size == 0:return head

    start_node = None
    start_pre_node = None
    pre = None
    p = head
    i = 1
    while i<=node_size:
        if i%k == 1:
            start_node = p
            pre = p
            p = p.next
        elif i%k >0:
            temp = p.next
            p.next = pre
            pre = p
            p = temp
        else:
            temp = p.next
            p.next = pre
            pre = p
            p = temp
            if start_pre_node:
                start_pre_node.next = pre
            else:
                head = pre
            start_pre_node = start_node
        i += 1
    start_pre_node.next = p
    return head

删除链表的倒数第 N 个结点

2023-12-20T16:13:40.png

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:
    node_size = 0
    p = head
    while p:
        p=p.next
        node_size += 1
    remove_index = node_size - n
    if remove_index == 0:
        return head.next
    p = head
    i = 0
    pre = None
    while i<remove_index:
        pre = p
        p = p.next
        i += 1
    pre.next = p.next
    return head

删除排序链表中的重复元素 II

2023-12-20T16:23:50.png

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
def deleteDuplicates(self, head: Optional[ListNode]) -> Optional[ListNode]:
    p = head
    pre = None
    while p:
        if (p.next == None) or (p.next and p.next.val != p.val):
            if not pre:
                head = p
            else:
                pre.next = p
            pre = p
            p = p.next
        else:
            val = p.val
            while p and p.val == val:
                p = p.next
    if pre:
        pre.next = p
        return head
    else:
        return None

旋转链表

2023-12-20T16:54:16.png

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def rotateRight(self, head: Optional[ListNode], k: int) -> Optional[ListNode]:
        if not head:return None
        node_size = 1
        p = head
        while p.next:
            p = p.next
            node_size += 1
        index = k%node_size
        if index == 0:return head
        p.next = head
        p = head
        i = 0
        pre = None
        while i<node_size-index:
            pre = p
            p = p.next
            i += 1
        pre.next = None
        return p

分隔链表

2023-12-20T17:04:19.png

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def partition(self, head: Optional[ListNode], x: int) -> Optional[ListNode]:
        if not head:return None
        tail1 = None
        tail2 = None
        head1 = None
        head2 = None
        p = head
        while p:
            if p.val < x:
                if head1 == None:
                    head1 = p
                    tail1 = p
                else:
                    tail1.next = p
                    tail1 = p
            else:
                if head2 == None:
                    head2 = p
                    tail2 = p
                else:
                    tail2.next = p
                    tail2 = p
            p = p.next
        if head1 != None:
            if head2 != None:
                tail1.next = head2
                tail2.next = None
            return head1
        else:
            return head2