legongju.com
我们一直在努力
2025-01-15 23:29 | 星期三

如何利用双重指针实现链表操作

双重指针(也称为哑指针或哨兵节点)在链表操作中非常有用,特别是当需要简化边界条件处理、提高代码可读性和减少错误时。以下是使用双重指针实现链表操作的一些建议:

  1. 合并两个有序链表:
class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

def mergeTwoLists(l1: ListNode, l2: ListNode) -> ListNode:
    dummy = ListNode(-1)
    current = dummy

    while l1 and l2:
        if l1.val < l2.val:
            current.next = l1
            l1 = l1.next
        else:
            current.next = l2
            l2 = l2.next
        current = current.next

    if l1:
        current.next = l1
    elif l2:
        current.next = l2

    return dummy.next
  1. 删除链表中的重复元素:
def deleteDuplicates(head: ListNode) -> ListNode:
    if not head or not head.next:
        return head

    dummy = ListNode(-1)
    dummy.next = head
    current = dummy
    prev = dummy

    while current.next and current.next.next:
        if current.next.val == current.next.next.val:
            while current.next and current.next.val == current.next.next.val:
                current = current.next
            prev.next = current.next
        else:
            prev = current
            current = current.next

    return dummy.next
  1. 反转链表:
def reverseList(head: ListNode) -> ListNode:
    prev = None
    current = head

    while current:
        next_node = current.next
        current.next = prev
        prev = current
        current = next_node

    return prev
  1. 找到链表的中间节点:
def middleNode(head: ListNode) -> ListNode:
    slow = head
    fast = head

    while fast and fast.next:
        slow = slow.next
        fast = fast.next.next

    return slow
  1. 删除链表的倒数第k个节点:
def removeNthFromEnd(head: ListNode, k: int) -> ListNode:
    dummy = ListNode(-1)
    dummy.next = head
    first = dummy
    second = dummy

    for _ in range(k):
        first = first.next

    while first:
        first = first.next
        second = second.next

    second.next = second.next.next

    return dummy.next

这些示例展示了如何使用双重指针简化链表操作。在实际应用中,您可能需要根据具体需求调整代码。

未经允许不得转载 » 本文链接:https://www.legongju.com/article/81332.html

相关推荐

  • c++ mysql库的数据更新与删除操作

    c++ mysql库的数据更新与删除操作

    在C++中,可以使用MySQL C++ Connector库来进行数据更新和删除操作。以下是一个简单的示例代码,展示如何使用MySQL C++ Connector库来进行数据更新和删除操作:<...

  • c++ memset_s与memset有何不同

    c++ memset_s与memset有何不同

    memset_s 和 memset 都是 C++ 中用于设置内存区域的函数,但它们之间存在一些关键差异 安全性:memset_s 是一个更安全的版本,因为它会检查目标缓冲区的大小。如...

  • c++中使用memset_s需要注意什么

    c++中使用memset_s需要注意什么

    在C++中,memset_s函数是一个安全的内存设置函数,它可以防止缓冲区溢出 包含头文件:在使用memset_s之前,请确保已经包含了正确的头文件。对于C++,应该包含头文...

  • c++ memset_s如何安全清零内存

    c++ memset_s如何安全清零内存

    在C++中,memset_s是一个安全的方法来清零内存
    #include
    #include int main() { char buffer[100]; // 填充缓冲区 for (int i = 0; i< sizeof(buffer)...

  • c++双重指针能否用于指向指针数组

    c++双重指针能否用于指向指针数组

    是的,C++中的双重指针可以用于指向指针数组。
    双重指针是指一个指针变量指向另一个指针变量,而后者又指向一个指针数组。这种结构通常用于处理二维数组或者...

  • c++双重指针在函数参数传递中的作用

    c++双重指针在函数参数传递中的作用

    C++双重指针在函数参数传递中的作用主要体现在以下几个方面: 修改实参变量的值:通过使用指向指针的指针,我们可以在函数内部修改实参变量的值。这在需要改变原...

  • c++ class类模板怎样创建

    c++ class类模板怎样创建

    在C++中,创建类模板的步骤如下: 定义模板声明(template declaration): template class ClassName; 这里,template 表示这是一个模板类,typename T是一个类...

  • c++ class类运算符重载怎么做

    c++ class类运算符重载怎么做

    在 C++ 中,你可以通过定义特殊的成员函数来重载类运算符。这些成员函数以关键字 operator 开头,后面紧跟要重载的运算符,然后是括号,括号内可以包含参数列表(...