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. TFS自定义开发中的反射应用

    最近CM(Configuration Management) 的同事在自定义开发TFS的过程中遇到一个问题. 领导要求快速开发一个工具, 可以自动连接TFS,然后自动Check out一些word文件 ...

  2. 升级MySQL 5.7版本遇到的一些小问题(转)

    在5.6版本服务器做备份 /usr/local/mysql/bin/mysqldump -S /tmp/mysql3306.sock -A -p --set-gtid-purged=OFF > ...

  3. Azure blob Storage Snapshot

    用户虚拟机硬盘的备份是客户在部署云应用中是一个非常重要的部分. 目前有多种平台的备份方法: 捕获镜像:可以采用Capture的方式(powershell命令为Save-AzureVMImage)捕获虚 ...

  4. C#某月的第一天和最后一天

    1.本月的第一天===>DateTime.Now.AddDays(1 - DateTime.Now.Day);//当前日期减去当前日期和本月一号相差天数 2.本月的最后一天===>Date ...

  5. Less:Less(CSS预处理语言)

    ylbtech-Less:Less(CSS预处理语言) Less 是一门 CSS 预处理语言,它扩充了 CSS 语言,增加了诸如变量.混合(mixin).函数等功能,让 CSS 更易维护.方便制作主题 ...

  6. SpringMvc之参数绑定注解详解之三

    2. @RequestHeader.@CookieValue @RequestHeader 注解,可以把Request请求header部分的值绑定到方法的参数上. 示例代码: 这是一个Request ...

  7. linux命令-vim编辑模式

    按  i  键 进去编辑模式 左下角显示 插入 按 I  键 进入编辑模式 光标到行首 按 a 键 在光标的后一位 按A 键 光标在行尾 按 o 键 在光标下面另起一行 按O 键  在光标上面另起一行 ...

  8. mysql设置远程登录

    服务器上,我们刚安装好MySQL后,是没有办法直接远程的,它只支持本地登录.所以我们必须要对刚安装好的MySQL进行设置,允许远程登录. 1. 使用“mysql -uroot -p”命令可以连接到本地 ...

  9. python的语法糖

    # -*- coding: utf-8 -*-def deco(func): print("before myfunc() called.") func() print(" ...

  10. .NET中的泛型委托

    .Net中有一个内置的委托 Func 它总共有以下5种形式 1.  Func<TResult> 2.  Func<T,TResult> 3.  Func<T1,T2,TR ...