章三 链表

1  Reverse Linked List

    public ListNode reverse(ListNode head) {
        // write your code here
        ListNode pre = null;
        while (head != null) {
            ListNode temp = head.next;
            head.next = pre;
            pre = head;
            head = temp;
        }
        return pre;
    }

2 Reverse Linked List II

    public ListNode reverseBetween(ListNode head, int m , int n)
    {
       if (head == null || m >= n) {
           return head;
       }
       ListNode dummy = new ListNode(0);
       dummy.next = head;
       head = dummy;

       for (int i = 1; i < m; i++) {
           if (head == null) {
               return null;
           }
           head = head.next;
       }

       ListNode premNode = head;
       ListNode mNode = head.next;
       ListNode nNode = mNode;
       ListNode postnNode = mNode.next;

       for (int i = m; i < n; i++) {
           if(postnNode == null) {
               return null;
           }
           ListNode temp = postnNode.next;
           postnNode.next = nNode;
           nNode = postnNode;
           postnNode = temp;
       }

       mNode.next = postnNode;
       premNode.next = nNode;
       return dummy.next;
    }

不熟悉

3 Remove Duplicates from Sorted List

    public static ListNode deleteDuplicates(ListNode head)
    {
        if (head == null) {
            return head;
        }

        ListNode node = head;
        while (node != null) {
            if (node.next != null && node.val == node.next.val) {
                node.next = node.next.next;
            } else {
                node = node.next;
            }
        }

        return head;
    }  

不熟悉

4  Remove Duplicates from Sorted List II

    public static ListNode deleteDuplicates(ListNode head)
    {
        // write your code here
        if (head == null || head.next == null) {
            return head;
        }

        ListNode dummy = new ListNode(0);
        dummy.next = head;
        head = dummy;

        while (head.next != null && head.next.next != null) {
            if (head.next.val == head.next.next.val) {
                int val = head.next.val;
                while (head.next != null && head.next.val == val) {
                    head.next = head.next.next;
                }
            } else {
                head = head.next;
            }
        }

        return dummy.next;
    }

don‘t care

5  Partition List

    public ListNode partition(ListNode head, int x)
    {
        // write your code here
        if (head == null) {
            return head;
        }

        ListNode leftDummy = new ListNode(0);
        ListNode rightDummy = new ListNode(0);
        ListNode left = leftDummy;
        ListNode right = rightDummy;

        while (head != null) {
            if (head.val < x) {
                left.next = head;
                left = head;
            } else {
                right.next = head;
                right = head;
            }
            head = head.next;
        }

        left.next = rightDummy.next;
        right.next = null;
        return leftDummy.next;
    }

6 Merge Two Sorted Lists

     public ListNode mergeTwoLists(ListNode l1, ListNode l2)
     {
        ListNode dummy = new ListNode(0);
        ListNode tail = dummy;
        while (l1 != null && l2 != null) {
            if (l1.val < l2.val) {
                tail.next = l1;
                l1 = l1.next;
            } else {
                tail.next = l2;
                l2 = l2.next;
            }
            tail = tail.next;
        }
        if (l1 != null) {
            tail.next = l1;
        } else {
            tail.next = l2;
        }
        return dummy.next;
     }

7 Sort List

    public ListNode sortList(ListNode head) {
        if (head == null || head.next == null) {
            return head;
        }

        ListNode slow = findMiddle(head);
        ListNode left = sortList(slow.next);
        slow.next = null;
        ListNode right = sortList(head);

        return mergeTwoLists(left, right);
    }
    ListNode findMiddle(ListNode head) {
        ListNode slow = head;
        ListNode fast = head.next;

        while (fast != null && fast.next != null) {
            fast = fast.next.next;
            slow = slow;
        }

        return slow;
    }
      ListNode mergeTwoLists(ListNode l1, ListNode l2)
     {
        ListNode dummy = new ListNode(0);
        ListNode tail = dummy;
        while (l1 != null && l2 != null) {
            if (l1.val < l2.val) {
                tail.next = l1;
                l1 = l1.next;
            } else {
                tail.next = l2;
                l2 = l2.next;
            }
            tail = tail.next;
        }
        if (l1 != null) {
            tail.next = l1;
        } else {
            tail.next = l2;
        }
        return dummy.next;
     }

  error

    public ListNode sortList(ListNode head) {
        if (head == null || head.next == null) {
            return head;
        }

        ListNode slow = findMiddle(head);
        ListNode left = sortList(slow.next);
        slow.next = null;
        ListNode right = sortList(head);

        return mergeTwoLists(left, right);
    }
    ListNode findMiddle(ListNode head) {
        ListNode slow = head;
        ListNode fast = head.next;

        while (fast != null && fast.next != null) {
            fast = fast.next.next;
            slow = slow.next;
        }

        return slow;
    }
      ListNode mergeTwoLists(ListNode l1, ListNode l2)
     {
        ListNode dummy = new ListNode(0);
        ListNode tail = dummy;
        while (l1 != null && l2 != null) {
            if (l1.val < l2.val) {
                tail.next = l1;
                l1 = l1.next;
            } else {
                tail.next = l2;
                l2 = l2.next;
            }
            tail = tail.next;
        }
        if (l1 != null) {
            tail.next = l1;
        } else {
            tail.next = l2;
        }
        return dummy.next;
     }

8 Reorder List

    public void reorderList(ListNode head) {
        if (head == null || head.next == null) {
            return;
        }

        ListNode mid = findMiddle(head);
        ListNode tail = reverse(mid.next);
        mid.next = null;
        merge(head, tail);
    }
    ListNode findMiddle(ListNode head) {
        ListNode slow = head;
        ListNode fast = head.next;

        while (fast != null && fast.next != null) {
            fast = fast.next.next;
            slow = slow.next;
        }

        return slow;
    }
    ListNode reverse(ListNode head) {
        // write your code here
        ListNode pre = null;
        while (head != null) {
            ListNode temp = head.next;
            head.next = pre;
            pre = head;
            head = temp;
        }
        return pre;
    }
     void merge(ListNode l1, ListNode l2)
     {
        ListNode dummy = new ListNode(0);
        ListNode tail = dummy;
        int index = 0;

        while (l1 != null && l2 != null) {
            if (index % 2 == 0) {
                tail.next = l1;
                l1 = l1.next;
            } else {
                tail.next = l2;
                l2 = l2.next;
            }
            tail = tail.next;
            index++;
        }
        if (l1 != null) {
            tail.next = l1;
        } else {
            tail.next = l2;
        }
     }

9 Remove Nth Node From End of List

    ListNode removeNthFromEnd(ListNode head, int n)
    {
        if (n <= 0) {
            return head;
        }

        ListNode dummy = new ListNode(0);
        dummy.next = head;

        ListNode preDelete = dummy;
        for(int i = 0; i < n; i++) {
            if (head == null) {
                return null;
            }
            head = head.next;
        }

        while (head != null) {
            preDelete = preDelete.next;
            head = head.next;
        }

        preDelete.next = preDelete.next.next;
        return dummy.next;
    }

10 Linked List Cycle

    public boolean hasCycle(ListNode head) {
        if (head == null) {
            return false;
        }

        ListNode fast = head.next;
        ListNode slow = head;

        while (fast != null && fast.next != null) {
            fast = fast.next.next;
            slow = slow.next;
            if (fast == slow) {
                return true;
            }
        }
        return false;
    }

11 Linked List Cycle II

    public ListNode detectCycle(ListNode head)
    {  

        ListNode slow = head;
        ListNode fast = head;
        boolean hasCycle = false;

        while (fast != null && fast.next != null) {
            fast = fast.next.next;
            slow = slow.next;
            if (fast == slow) {
                hasCycle = true;
                break;
            }
        }

        if (!hasCycle) {
            return null;
        }

        fast = head;
        while (fast != slow) {
            fast = fast.next;
            slow = slow.next;
        }

        return fast;
    }

12 Merge k Sorted Lists

    private Comparator<ListNode> ListNodeComparator = new Comparator<ListNode>() {
        public int compare(ListNode left, ListNode right) {
            return left.val - right.val;
        }
    };
    public ListNode mergeKLists(List<ListNode> lists)
    {
        if (lists == null || lists.size() == 0) {
            return null;
        }

        Queue<ListNode> heap = new PriorityQueue<ListNode>(lists.size(), ListNodeComparator);

        for (int i = 0; i < lists.size(); i++) {
            if (lists.get(i) != null) {
                heap.add(lists.get(i));
            }
        }

        ListNode dummy = new ListNode(0);
        ListNode tail = dummy;

        while (!heap.isEmpty()) {
            ListNode node = heap.poll();
            tail.next = node;
            tail = node;
            if (node.next != null) {
                heap.add(node.next);
            }
        }

        return dummy.next;
    }

13 Convert Sorted List to Balanced BST

 public TreeNode sortedListToBST(ListNode head)
    {
        // write your code here
        if (head == null)
        {
            return null;
        }
        int count = 0;
        ListNode cur = head;
        while (cur != null)
        {
            cur = cur.next;
            count++;
        }
        ArrayList<ListNode> list = new ArrayList<ListNode>();
        list.add(head);
        return helper(list, 0, count - 1);
    }
    public TreeNode helper(ArrayList<ListNode> list, int l, int r)
    {
        if (l > r)
        {
            return null;
        }
        int m = (l + r) / 2;
        TreeNode left = helper(list, l, m - 1);
        TreeNode root = new TreeNode(list.get(0).val);
        root.left = left;
        list.set(0, list.get(0).next);
        root.right = helper(list, m + 1, r);
        return root;
    }

时间: 2024-10-25 06:43:26

章三 链表的相关文章

数据结构与算法JavaScript (三) 链表

数据结构与算法JavaScript (三) 链表 我们可以看到在javascript概念中的队列与栈都是一种特殊的线性表的结构,也是一种比较简单的基于数组的顺序存储结构.由于 javascript的解释器针对数组都做了直接的优化,不会存在在很多编程语言中数组固定长度的问题(当数组填满后再添加就比较困难了,包括添加删除, 都是需要把数组中所有的元素全部都变换位置的,javascript的的数组确实直接给优化好了,如 push,pop,shift,unshift,split方法等等…) 线性表的顺序

第8章 三路由不同网段互通实验(中级篇)

第8章三路由不同网段互通实验( 中级篇) 一实验目的 学习如何给路由器接口配置网关.子网掩码 学习如何给路由器配置静态路由 学习如何在路由器上配置环回口 二实验工具 GNS3软件   http://yunpan.cn/cwkDa4MWJwiiV  访问密码 9b1a 思科IOS     http://yunpan.cn/cjDjwg4CXMxpw  访问密码 9c14 三实验描述 需要实现当192.168.20.0/24访问192.168.30.0/24网段时,数据是从R2到R3. 当192.1

Redis 设计与实现(第三章) -- 链表adlist

概述 1.链表介绍 2.链表API 链表介绍 链表在Redis中的应用非常广泛,比如列表键list的底层实现就是使用的链表.除了列表键外,Redis的发布与订阅.慢查询.监视器等功能也用到了链表,Redis服务器本身还使用了链表来保存客户端连接状态,以后使用链表来构建客户端输出缓冲区. 链表在Redis的数据结构如下: typedef struct listNode { struct listNode *prev; //前一个节点 struct listNode *next; //后一个节点,可

数据结构之---C语言实现二叉树的三链表存储表示

//二叉树的三叉链表存储 //杨鑫 #include <stdio.h> #include <stdlib.h> #define max(a, b) a > b ? a : b #define ClearBiTree DestroyBiTree typedef char TElemType; // 二叉树的三叉链表存储表示 typedef struct BiTPNode { TElemType data; struct BiTPNode *parent,*lchild,*rc

X32位 天堂2 二章/三章 服务端协议号修改方法

[本方法适合于2004-2006年之间天堂2由初章服务端修改至二章.三章端时协议号匹配问题]服务端版本位32位初章服务端 目前大部分SF用的协议号情况: 服务端是419 客户端是 417 419 420(外挂) 转换成 十六进制的是 01A3 按从低到高的存放方式就是 A301 首先修改 服务端 L2server.exe 在UE里的 0010105ch 位置处的 B8 A3 01 00 00 修改成你的即可(十进制的三位数,原因,后面说)注意首先用计算器把你的十进制转换成十六进制的,在填写进去如

数据结构与算法三(链表)

一.链表 1.什么是链表 和数组一样,链表也是一种线性表 从内存结构上看,链表的内存结构是不连续的内存空间,是将一组零散的内存块串联起来,从而进行数据存储的数据结构 链表中的每一个内存块被称为节点Node,节点除了存储数据外,还需记录链上下一个节点的地址,即后继指针next 2.常见的缓存策略 先进先出策略FIFO (First In,First Out) 最少使用策略LFU (Least Frequently Used) 最近最小使用策略LRU(Least Recently Used) 3.常

数据结构与算法(三)--链表

一.链表 单项链表.循环链表.双向链表 链表和数组不同,链表的每个元素都存储了下一个元素的地址,所以链表不需要连续的存储空间: 如果我们申请一个 100MB 大小的数组,当内存中没有连续的.足够大的存储空间时,即便内存的剩余总可用空间大于 100MB,仍然会申请失败. 1.单链表:内存块称为链表的"结点",把这个记录下个结点地址的指针叫作后继指针 next 头结点用来记录链表的基地址.有了它,我们就可以遍历得到整条链表.而尾结点特殊的地方是:指针不是指向下一个结点,而是指向一个空地址

【Weiss】【第03章】链表例程

这种基础例程,如之前所提,会有一个实现和一个简单的测试代码. 链表其实没什么可说的,其实包括后面的栈和队列也没什么可说的,直接放代码吧. 下面这个是测试代码 1 #include <iostream> 2 #include "linklist.cpp" 3 using namespace std; 4 using namespace linklist; 5 template class List<int>; 6 int main(void) 7 { 8 List

【Weiss】【第03章】链表例程的一些修改

主要是,感觉原来的链表例程通过Node的分配形成了链表,但是没有自动消除Node的办法比较危险,一旦在clear()之前把链表赋了其它值就内存泄漏了. 所以改了析构函数,自动清理分配出来的内存.既然改了析构同时就要改拷贝合成与拷贝赋值. 然后还给链表加了个尾指针,否则每次插入都要O(N)的时间真的很蛋疼……改了以后就是O(1)了 栈.队列.双链表的到时候再改. 添加的构造函数.赋值函数.析构函数如下: 1 //构造函数,这部分直接增加在链表内部 2 public: 3 //拷贝构造函数,深拷贝