1、链表数据结构

内存利用率高;动态分配

2、链表类定义

单向链表节点

public calss ListNode {

  int val =0;

  ListNode next = null;

  public void Node(int val_) {

    this.val = val_;

    this.next = null;

  }

}

单向链表类:

public class LinkedList {

  private ListNode head = null;

  private ListNode tail = null;

  private int size = 0;

  public void LinkedList() {

    head = null;

    tail = null;

    size = 0;

  }

}

LinkedList构造函数用默认构造函数就可以,可以不实现。

3、链表的操作

1)添加add,2)按索引删除remove,3)取值get,4)修改set,5)按值删除removeByValue

public class LinkedList {

  private ListNode head = null;

  private ListNode tail = null;

  private int size = 0;

  /////////////////////////////getEntry//////////////////////////////

  public ListNode getEntry(int index) {

    if (index < 0 || index >= size) {

      return null;//或者抛出异常

    }

    ListNode cur = head;

    while (index-- != 0) {

      cur = cur.next;

    }

    return cur;

  }

  ///////////////////add////////////////////

  public void add(int index, int value) {

    if (index <0 || index > size) {

      return;//抛出异常

    }

    size++;

    LiseNode newNode  = new ListNode(value);

    if (index == 0) {

      newNode.next = head.next;

      head.next = newNode;

      return;

    }

    ListNode pre = getEntry(index - 1);

    newNode.next = pre.next;

    pre.next  = newNode;

  }

  //////////////////////remove////////////////////////

  public void remove(int index) {

    if (index  < 0 || index >= size) {

      return;///抛出异常

    }

    size--;

    if(index == 0) {

      head = head.next;

      return;

    }

    ListNode pre = getEntry(index - 1);

    pre.next = pre.next.next;

  }

  ////////////////////////get////////////////////

  public int get(int index) {

    if (index < 0 || index >= size) {

      return 0;///抛出异常

    }

    ListNode cur = getEntry(index);

    return cur.val;

  }

  /////////////////////set/////////////////////////////

  public void set(int index, int value) {

    if (index < 0 || index >= size) {

      return;//抛出异常

    }  

    ListNode cur = getEntry(index);

    cur.val = value;

  }

  /////////////////////////removeByValue/////////////////////////////

  public void removeByValue(int value) {

    ///暂时先不实现了。找到所有值相等的节点删除。

  }

}

可以使用dummy节点来消除head节点无前驱的问题。

public void add(int index, int value) {

  if (index < 0 || index >= size) {

    return;///抛出异常

  }

  size++;

  ListNode dummy = new ListNode();

  dummy.next = head;

  LiseNode pre = dummy;

  while (index-- != 0) {

    pre = pre.next;

  }

  ListNode newNode = new ListNode(value);

  newNode.next = pre.next;

  pre.next = newNode;

  head = dummy.next;

}

public void remove(int index) {

  if (index < 0 || index >= size) {

    return;//抛出异常

  }  

  size--;

  ListNode dummy = new ListNode(-1);

  dummy.next = head;

  ListNode pre = dummy;

  while (i-- != 0) {

    pre = pre.next;

  }

  pre.next = pre.next.next;

  head = dummy.next;

}

3、链表应用count related

1)linkedlist length

public int getLength(ListNode head) {

  ListNode cur = head;

  int length = 0;

  while(cur != null) {

    length++;

    cur = cur.next;

  }

  return length;

}

2)Kth node from the end

Given a linked list,  return the kth node from the end. Linked list will never beempty and k will always be valid.

Examples:

Input: 1->4->2->3, 2

Output: 2

Input: 3->5->9->6->8, 3

Output: 9

  k is counted from 0 or 1?

method 1:

public LinkedList getTargetNode(ListNode head, int k) {

  int length = 0;

  length = getLength(head);

  ListNode cur = head;

  for (int i = 0; i < length - k; i++) {

    cur = cur.next;

  }

  return cur;

}

时间复杂度:n + n - k = 2 * n - k

method 2:

public ListNode getTargetNode(ListNode head, int k) {

  ListNode curForward = head;

  ListNode curPost = head;

  int i = 0;

  while (i < k) {

    curForward = curForward.next;

    i++;

  }

/***

*while (k-- != 0) {curForward = curForward.next}

***/

  while (curForward != null) {

    curForward = curForward.next;

    curPost = curPost.next;

  }

  return curPost;

}

时间复杂度:k + 2 * (n-k) = 2 * n - k

3、middle node

Given a linked list,  return the middle node. Linked list will never be empty.

Examples:

Input: 1->4->2->3

Output: 4

Input: 3->5->9->6->8

Output: 9

method 1:

public ListNode getMiddleNode(ListNode head) {

  ListNode cur = head;

  int length = getLength(head);

  int i = (length - 1) / 2;

  while (i-- != 0) {

    cur = cur.next;

  }

  return cur;

}

method 2:

public ListNode getMiddleNode(ListNode head) {

  ListNode fast = head;

  ListNode slow = head;

  while (fast.next != null && fast.next.next != null) {

    fast = fast.next;

    slow = slow.next;

  }

  return slow;

}

4、Linked List Cycle

Given a linked list,  define if there is a cycle in it.

Examples:

Input: 1->4->2->3

Output: false.

Input: 3->5->9->3(original)

Output: true

public boolean findListCycle(ListNode head) {

  ListNode fast = head;

  ListNode slow = head;

  while (fast != null && fast.next != null) {

    if (fast.next == slow) {/******中间差一步时,下一个循环是slow走一步,fast走两步,相遇*******/

      return true;

    }

    slow = slow.next;

    fast = fast.next.next;

  }

  return false;

}

链表的环入口节点分析:http://blog.csdn.net/cyuyanenen/article/details/51712420

linkedlist--lecture-4的更多相关文章

  1. [C2P3] Andrew Ng - Machine Learning

    ##Advice for Applying Machine Learning Applying machine learning in practice is not always straightf ...

  2. To Java程序员:切勿用普通for循环遍历LinkedList

    ArrayList与LinkedList的普通for循环遍历 对于大部分Java程序员朋友们来说,可能平时使用得最多的List就是ArrayList,对于ArrayList的遍历,一般用如下写法: p ...

  3. 计算机程序的思维逻辑 (39) - 剖析LinkedList

    上节我们介绍了ArrayList,ArrayList随机访问效率很高,但插入和删除性能比较低,我们提到了同样实现了List接口的LinkedList,它的特点与ArrayList几乎正好相反,本节我们 ...

  4. 深入理解java中的ArrayList和LinkedList

    杂谈最基本数据结构--"线性表": 表结构是一种最基本的数据结构,最常见的实现是数组,几乎在每个程序每一种开发语言中都提供了数组这个顺序存储的线性表结构实现. 什么是线性表? 由0 ...

  5. 用JavaScript来实现链表LinkedList

    本文版权归博客园和作者本人共同所有,转载和爬虫请注明原文地址. 写在前面 好多做web开发的朋友,在学习数据结构和算法时可能比较讨厌C和C++,上学的时候写过的也忘得差不多了,更别提没写过的了.但幸运 ...

  6. ArrayList LinkedList源码解析

    在java中,集合这一数据结构应用广泛,应用最多的莫过于List接口下面的ArrayList和LinkedList; 我们先说List, public interface List<E> ...

  7. ArrayList、Vector、LinkedList的区别联系?

    1.ArrayList.Vector.LinkedList类都是java.util包中,均为可伸缩数组. 2.ArrayList和Vector底层都是数组实现的,所以,索引数据快,删除.插入数据慢. ...

  8. LinkedList<E>源码分析

    LinkedList的数据结构就是双向链表,如下所示: private static class Node<E> { E item;//数据元素 Node<E> next;// ...

  9. Java集合之LinkedList

    一.LinkedList概述 1.初识LinkedList 上一篇中讲解了ArrayList,本篇文章讲解一下LinkedList的实现. LinkedList是基于链表实现的,所以先讲解一下什么是链 ...

  10. 集合 LinkedList、ArrayList、Set、Treeset

    LinkedList中特有的方法: 1:方法介绍 addFirst(E e) addLast(E e) getFirst() getLast() removeFirst() removeLast() ...

随机推荐

  1. MySQL on Azure高可用性设计 DRBD - Corosync - Pacemaker - CRM (二)

    在上一篇文章中描述了MySQL HA on Azured 设计思路,本篇文章中将描述具体的部署,每个组件的安装和配置. 整体的设计架构如下: 下面将是所有组件的安装配置过程,所有的虚拟机是CentOS ...

  2. ThinkPHP5.1的公共函数

    最初使用ThinkPHP3.2.3的时候,我们自己定义的公共函数常常放置于 \Common\function.php ThinkPHP5.1 公共函数 项目公用的会放在 \application\co ...

  3. VS Code:快捷方式

    转于:vscode: Visual Studio Code 常用快捷键 博主:魚魚 更多操作参见官网:https://code.visualstudio.com/docs/getstarted/key ...

  4. AjaxMethod的使用

        AjaxMethod的使用 使用AjaxMethod要满足一下几点: 1.如果还没有ajax.dll文件,就先下载一个来 2.将ajax.dll添加到项目引用中:在VS的解决方案资源管理器中右 ...

  5. MySQL的limit优化

    mysql的分页比较简单,只需要limit offset,length就可以获取数据了,但是当offset和length比较大的时候,mysql明显性能下降 1.子查询优化法 先找出第一条数据,然后大 ...

  6. [cf839d]Winter is here容斥原理

    题意:给定一个数列${a_i}$,若子序列长度为$k$,最大公约数为$gcd$,定义子序列的权值为$k*\gcd (\gcd  > 1)$.求所有子序列的权值和. 答案对10^9+7取模. 解题 ...

  7. 2017 world final

    E 解题关键:二分时注意C函数的单调性. #include<bits/stdc++.h> #define eps 1e-8 #define INF 0x3f3f3f3f using nam ...

  8. js刷新页面方法大全(转)

    刷新页面实现方式总结(HTML,ASP,JS) 转载  2008-11-13   作者:    我要评论 多种方法实现页面的刷新代码 定时刷新: 1,<script>setTimeout( ...

  9. ubuntu判断系统是32位还是64位

    1. 打开终端. 2. 输入命令  sudo uname -m 3. 如果输出为 x86_64, 则说明是64位操作系统:如果输出为 i686,说明是32位操作系统.

  10. python远程登录Paramiko模块的安装

    最近做云平台的项目,需要使用python来管理所有的主机,我选择了paramiko.它跨平台的,linux和window都可以使用,pssh只支持linux. 1:安装gcc和python-devel ...