linkedlist--lecture-4
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的更多相关文章
- [C2P3] Andrew Ng - Machine Learning
##Advice for Applying Machine Learning Applying machine learning in practice is not always straightf ...
- To Java程序员:切勿用普通for循环遍历LinkedList
ArrayList与LinkedList的普通for循环遍历 对于大部分Java程序员朋友们来说,可能平时使用得最多的List就是ArrayList,对于ArrayList的遍历,一般用如下写法: p ...
- 计算机程序的思维逻辑 (39) - 剖析LinkedList
上节我们介绍了ArrayList,ArrayList随机访问效率很高,但插入和删除性能比较低,我们提到了同样实现了List接口的LinkedList,它的特点与ArrayList几乎正好相反,本节我们 ...
- 深入理解java中的ArrayList和LinkedList
杂谈最基本数据结构--"线性表": 表结构是一种最基本的数据结构,最常见的实现是数组,几乎在每个程序每一种开发语言中都提供了数组这个顺序存储的线性表结构实现. 什么是线性表? 由0 ...
- 用JavaScript来实现链表LinkedList
本文版权归博客园和作者本人共同所有,转载和爬虫请注明原文地址. 写在前面 好多做web开发的朋友,在学习数据结构和算法时可能比较讨厌C和C++,上学的时候写过的也忘得差不多了,更别提没写过的了.但幸运 ...
- ArrayList LinkedList源码解析
在java中,集合这一数据结构应用广泛,应用最多的莫过于List接口下面的ArrayList和LinkedList; 我们先说List, public interface List<E> ...
- ArrayList、Vector、LinkedList的区别联系?
1.ArrayList.Vector.LinkedList类都是java.util包中,均为可伸缩数组. 2.ArrayList和Vector底层都是数组实现的,所以,索引数据快,删除.插入数据慢. ...
- LinkedList<E>源码分析
LinkedList的数据结构就是双向链表,如下所示: private static class Node<E> { E item;//数据元素 Node<E> next;// ...
- Java集合之LinkedList
一.LinkedList概述 1.初识LinkedList 上一篇中讲解了ArrayList,本篇文章讲解一下LinkedList的实现. LinkedList是基于链表实现的,所以先讲解一下什么是链 ...
- 集合 LinkedList、ArrayList、Set、Treeset
LinkedList中特有的方法: 1:方法介绍 addFirst(E e) addLast(E e) getFirst() getLast() removeFirst() removeLast() ...
随机推荐
- jenkins pipline 用法收集
1.下载多个项目 node { stage('clone'){ dir('test1'){ checkout([$class: 'GitSCM', branches: [[name: '*/maste ...
- 电脑当路由使用(目前只在win7上用过)
前提:电脑有无线网卡,并打开了无线 第一步使用管理员权限运行cmd.exe 1.执行如下命令 netsh wlan set hostednetwork mode=allow ssid=myWifi k ...
- C++模板特化编程
在C++中,模板特化是除了类之外的一种封装变化的方法.模板特化可以通过编译器来对不同的模板参数生成不同的代码. 模板特化通常以模板结构体作为载体.常用技法包括:类型定义.静态成员常量定义和静态成员函数 ...
- OpenXml 2.0 读取Excel
Excel 单元格中的数据类型包括7种: Boolean.Date.Error.InlineString.Number.SharedString.String 读取源代码: List<strin ...
- WEB服务器(IIS)的配置与管理
安装Web服务器(IIS) 在"服务器管理器"-"角色"-"添加角色"-选择"Web服务器(IIS)"进行安装 这里,我 ...
- JAVA基础知识总结4(面向对象特征之一:封装)
封 装:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式. 好处:将变化隔离:便于使用:提高重用性:安全性. 封装原则:将不需要对外提供的内容都隐藏起来,把属性都隐藏,提供公共方法对其访问. th ...
- super关键字主要有以下两种用途
super关键字主要有以下两种用途. 1.调用父类的构造方法 子类可以调用由父类声明的构造方法.但是必须在子类的构造方法中使用super关键字来调用.其具体的语法格式如下: super([参数列表]) ...
- 20. Linux提权:从入门到放弃
几点前提 已经拿到低权shell 被入侵的机器上面有nc,python,perl等linux非常常见的工具 有权限上传文件和下载文件 内核漏洞提权 提到脏牛,运维流下两行眼泪,我们留下两行鼻血.内核漏 ...
- 1. csrf 简介
浅谈CSRF CSRF是什么? (Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式,它在 年曾被列为互联网 大安全隐患之一,也被称为“One Click A ...
- 39、生鲜电商平台-redis缓存在商品中的设计与架构
说明:Java开源生鲜电商平台-redis缓存在商品中的设计与架构. 1. 各种计数,商品维度计数和用户维度计数 说起电商,肯定离不开商品,而附带商品有各种计数(喜欢数,评论数,鉴定数,浏览数,etc ...