• 链表


    1、删除链表中的某一个节点:删除链表的某一个节点一般分为三种情况,待删除节点为中间节点、头节点、尾结点。

    (1)待删除节点为中间节点的时候:可已用O(1)的时间复杂度去删除它。通过待删除节点,找到其后一个节点,然后将后一个节点覆盖到该节点即可达到删除的效果。

    补充:普通的思路删除这个节点是从前往后遍历,找到这个节点的前一个节点,修改前一个节点的指针。这样需要遍历,时间复杂度是o(n),这种方法时间复杂度过高,不去使用。

    (2)待删除节点为尾结点:这种只能从前往后遍历,找到该节点的前一个节点,将其next指针修改成null,时间复杂度为o(n)。

    (3)待删除节点为头节点:这时候要将其值和next指针全置空,时间复杂度为O(1)。

    因此,最坏的时间复杂度只有一种情形,就是在删除尾结点的时候。因此,可以计算删除链表节点的平均时间复杂度,((n-1)O(1)+O(n))/n,平均时间复杂度仍然为O(1)。

    补充:在程序中判断这个节点是什么类型的节点只需要取pNode.next,若为空,那就是尾结点;若不为空,就是中间节点;若phead=pToBeDelete,那就是头节点。

    2、链表常见的操作:

    1、翻转链表:

        public static ListNode reverseListNode(ListNode head) {
            ListNode newHead = null;
            while (head != null) {
                ListNode next = head.next;
                head.next = newHead;
                newHead = head;
                head = next;
            }
            return newHead;
        }

    2、删除链表中的某一个节点:

    删除的时候提前保存好下一个节点

    3、快慢指针寻找链表的中间节点:

        public static ListNode findMidNode(ListNode head) {
            ListNode slow = head;
            ListNode fast = head;
            while (fast.next != null && fast.next.next != null) {
                slow = slow.next;
                fast = fast.next.next;
            }
            return slow;
        }

    4、快慢指针判断链表是否有环:

    。。

  • 相关阅读:
    运算符的优先级(从高到低)
    常用字符与ASCII代码对照表
    02.数据类型常量与变量
    Java基础01
    2以太坊入门的方法2
    区块链学习笔记1
    5关键字this与super的区别
    4Java中成员变量与局部变量
    lua返回页面时中文乱码
    struts2中<jsp:forward>跳转时报404错误的问题
  • 原文地址:https://www.cnblogs.com/guoyu1/p/12227942.html
Copyright © 2020-2023  润新知