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. [转]Unity3D学习笔记(四)天空、光晕和迷雾

    原文地址:http://bbs.9ria.com/thread-186942-1-1.html 作者:江湖风云 六年前第一次接触<魔兽世界>的时候,被其绚丽的画面所折服,一个叫做贫瘠之地的 ...

  2. 对spring、AOP、IOP的理解 (转)

    spring 的优点?1.降低了组件之间的耦合性 ,实现了软件各层之间的解耦2.可以使用容易提供的众多服务,如事务管理,消息服务等3.容器提供单例模式支持4.容器提供了AOP技术,利用它很容易实现如权 ...

  3. 差一点搞混了Transactional注解

    今天给我的Srping业务层加如下Service和Transactional注解: @Service @Scope(BeanDefinition.SCOPE_SINGLETON) @Transacti ...

  4. AES算法的c++实现

    该模板无填充操作. 1.AES.h #include<cstdio> #include<cstring> #include<algorithm> #include& ...

  5. [Uva10641]Barisal Stadium(区间dp)

    题意:按照顺时针给出操场的周边点,然后给出周围可以建设照明灯的位置,以及在该位置建设照明灯的代价,照明灯照射的范围与操场的边界相切,现在要求一个最小的花费,要求操场的所有边都被照射到. 解题关键:预处 ...

  6. Spring开发包介绍

    -----------------siwuxie095                         核心开发包         建立 Spring 工程时,需要引入 Spring 的开发包,否则无 ...

  7. assert.strictEqual()

    assert.strictEqual(actual, expected[, message]) 使用全等运算符(===)测试 actual 参数与 expected 参数是否全等. // 格式 ass ...

  8. SCSS 中的 &::before 和 &::after

    在看一个文件的时候,发现有&::before 和 &::after, 没有理解怎么用的,因为以前在项目的css文件中,从来没有使用过,也没有见过 网上查询了一下,才发现&::b ...

  9. HDU 5973 Game of Taking Stones (威佐夫博弈+高精度)

    题意:给定两堆石子,每个人可以从任意一堆拿任意个,也可以从两堆中拿相同的数量,问谁赢. 析:直接运用威佐夫博弈,floor(abs(a, b) * (sqrt(5)+1)/2) == min(a, b ...

  10. Cygwin install apt-cyg

    1. UPDATE CYGWIN First of all you will need to ensure that Cygwin has the necessary binaries require ...