单链表

作者: YocnZhao | 来源:发表于2019-07-12 16:41 被阅读0次

单链表一些相关的算法集锦,单链表的算法可以提高逻辑能力。

反转链表

最基本的链表的题目,很简单的迭代操作,需要注意的就是保证时刻不要丢失Node,不要出现loop。

 /**
     * 链表反转,链表翻转
     * @param root
     * @return
     */
    private SingleNode reverseNode(SingleNode root) {
        if (root == null || root.next == null) {
            return root;
        }
        SingleNode result = root;
        SingleNode next = root.next;
        root.next = null;
        while (next != null) {
            SingleNode temp = next;
            next = next.next;
            temp.next = result;
            result = temp;
        }
        return result;
    }

移除链表中的元素

/**
     * 移除链表中的元素 普通写法,需要先找到不是val的head
     *
     * @param head
     * @param val
     * @return
     */
    public SingleNode removeElements(SingleNode head, int val) {
        if (head == null) {
            return head;
        }
        while (head.val == val) {
            head = head.next;
            if (head == null) {
                return head;
            }
        }
        SingleNode node = head;

        while (node.next != null) {
            if (node.next.val == val) {
                SingleNode temp = node.next.next;
                node.next = temp;
            }
            if (node.next == null) {
                break;
            }
            if (node.next.val != val) {
                node = node.next;
            }
        }
        return head;
    }

    /**
     * 移除链表中的元素,优化写法,使用一个头指针指向head,不用担心head就是需要移除的元素
     *
     * @param head
     * @param val
     * @return
     */
    public SingleNode removeElements2(SingleNode head, int val) {
        SingleNode preHead = new SingleNode(val - 1);
        preHead.next = head;
        SingleNode node = preHead;
        while (node.next != null) {
            if (node.next.val == val) {
                node.next = node.next.next;
            }
            if (node.next == null) {
                break;
            }
            if (node.next.val != val) {
                node = node.next;
            }
        }
        return preHead.next;
    }

合并两个顺序链表

 //合并两个顺序链表,方式1:左右为null的时候继续往后遍历
    public SingleNode merge(SingleNode left, SingleNode right) {
        if (left == null) return right;
        if (right == null) return left;
        SingleNode newNode = null;
        while (left != null || right != null) {
            if (left == null) {
                SingleNode n = right;
                right = right.next;
                n.next = newNode;
                newNode = n;
                continue;
            }
            if (right == null) {
                SingleNode n = left;
                left = left.next;
                n.next = newNode;
                newNode = n;
                continue;
            }
            if (left.val > right.val) {
                SingleNode n = right;
                right = right.next;
                n.next = newNode;
                newNode = n;
            } else {
                SingleNode n = left;
                left = left.next;
                n.next = newNode;
                newNode = n;
            }
        }
        return newNode;
    }

    //添加一个preHead指针,不在乎head是否为空
    public SingleNode mergeTwoLists(SingleNode l1, SingleNode l2) {
        SingleNode preHead = new SingleNode(0);
        SingleNode node = preHead;

        while (l1 != null || l2 != null) {
            if (l1 == null||l2 == null) {
                node.next = (l1==null)?l2:l1;
                break;
            }
            if (l1.val > l2.val) {
                SingleNode temp = l2;
                l2 = l2.next;
                node.next = temp;
                temp.next = null;
                node = temp;
            } else {
                SingleNode temp = l1;
                l1 = l1.next;
                node.next = temp;
                temp.next = null;
                node = temp;
            }
        }
        return preHead.next;
    }

相关文章

  • 单链表 C++

    单链表 C++ 题目 1、创建单链表2、初始化单链表3、释放单链表4、获取单链表中元素的数量5、输出单链表中的所有...

  • 线性表:顺序表和链表

    顺序表(数组)优缺点 链表优点 单链表使用 单链表结构 单链表初始化 单链表初始化 单链表建立: 头插法 尾插法 ...

  • 单向链表算法

    单向链表 反转单向链表 单链表查找倒数第k个节点 单链表递归倒序打印 单链表排序 单链表删除重复节点

  • 链表基本操作

    1、删除单链表节点 2、插入单链表结点 单链表具体实现

  • 25_静态单链表的实现

    关键词: 单链表的一个缺点、静态单链表设计思路、静态单链表的继承层次结构、静态单链表的实现思路、静态单链表的实现 ...

  • 线性表的链式存储-单链表

    单链表操作 [x] 单链表的创建(尾插法、头插法) [x] 单链表的查找操作 [x] 单链表的删除操作 [x] 单...

  • Algorithm小白入门 -- 单链表

    单链表递归反转链表k个一组反转链表回文链表 1. 递归反转链表 单链表节点的结构如下: 1.1 递归反转整个单链表...

  • 单链表反转

    单链表 单链表反转 递归方法

  • JavaScript数据结构2——单链表

    以下的代码包括了以下几部分 单链表初始化 单链表的插入 单链表的删除 单链表的创建(头插法) 单链表的创建(尾插法...

  • 链表

    链表:通过“指针”将零散的内存块联系起来。常见链表结构:单链表、循环链表和双链表。 单链表 对比数组学习单链表 循...

网友评论

      本文标题:单链表

      本文链接:https://www.haomeiwen.com/subject/xsdykctx.html