单向链表


简介


如上图所所示,每个节点包含两个成员变量:data和next(这里只是举一个最简单的例子,实际上有多少个成员变量,视需求而定),data可以是任意类型的,视需求而定;next就是node类型(node到底是什么类型,也是视需求而定),每一个节点的next指向他的下线节点,所以拿到一个节点后,可以直接拿到他的下线节点,如果下线节点不为空的话,一般把链表的第一个节点称为头节点,头节点没有上线节点,对于一个链表,拿到了他的头节点就相当于拿到了这个链表;最后一个节点称为尾节点,尾没有下线节点,其他的节点都会有下线节点,如果发现某个节点的next为空,即node.next = null,说明这个节点就是尾节点,这在遍历链表的时候经常用到;需要注意的是,在内存中,各个节点的内存地址不是连续的,而是离散的。

优缺点

创建单链表


添加头节点


实现思路:如果链表没有头结点,新结点直接成为头结点;否则新结点的next直接指向当前头结点,并让新结点成为新的头结点。

添加尾结点


实现思路:如果链表没有头结点,新结点直接成为头结点;否则需要先找到链表当前的尾结点,并将新结点插入到链表尾部。

指定位置添加节点

实现思路:先判断插入位置为头尾两端的情况,即index == 0插入到头部,index == size()插入到尾部;如果插入位置不是头尾两端,则先找出当前index位置的结点cur以及前一个结点 pre,然后cur成为新结点的下一个结点,新结点成为pre的后一个结点,这样就成功插入到index位置。


删除指定位置节点


实现思路:找出当前index位置的结点cur以及前一个结点 pre,pre.next直接指向cur.next即可删除cur结点。

增加头节点

链表的反转


实现思路:在链表遍历的过程中将指针顺序置换,即每遍历一次链表就让cur.next指向pre,最后一个结点成为新的头结点。反转之后指针入下图红线所示。


代码

public class SingleList {

//头节点

    private Node head;

private int size;

class Node{

private T value;

private Node next;

//创建节点时赋值,当前节点的下一个指针为null

        public Node(T value) {

this.value = value;

this.next =null;

}

@Override

        public String toString() {

return "Node{" +

"value=" +value +

", next=" +next +

'}';

}

}

/**

    * 添加头节点

    * 1、头节点不存在,直接赋值

    * 2、头节点存在,将新的节点变为头节点的,原来的头节点指向现在的头节点

    */

    public void addHeadNode(T value){

//创建节点

        Node newNode =new Node(value);

//如果头节点不存在,设置当前节点为头节点。

        if(head==null){

head =newNode;

return;

}

//新节点next直接指向当前头头节点。

        //新节点变为头节点

        newNode.next =head;

head =newNode;

}

/**添加节点到尾部

    * @param value

    */

    public void addTailNode(T value){

//创建节点

        Node node =new Node(value);

//如果节点是否存在,不存在直接放到头部

        if(null==head){

head =node;

return;

}

//找到最后一个节点

        Node last =head;

while(last.next!=null){

last = last.next;

}

//将新节点放入最后一个节点的next

        last.next =node;

}

/**添加到指定位置

    * @param value  值

    * @param index 集合位置

    */

    public void addNodeAtIndex(T value,int index){

//校验存放的位置

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

throw new IndexOutOfBoundsException("IndexOutOfBoundsException");

}

//

        if(index==0){

addHeadNode(value);

}else if(index==size()) {

//放入尾部

            addTailNode(value);

}else {

//插入中间位置

            Node node =new Node(value);

int position =0;

Node cur =head;//标记当前节点

            Node pre =null;//记录当前位置节点

            while(cur!=null){

if(position==index){

node.next=cur;

pre.next=node;

return;

}

pre = cur;

cur = cur.next;

position++;

}

}

}

public void deleteNodeAtIndex(int index){

//校验范围

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

throw new IndexOutOfBoundsException("IndexOutOfBoundsException");

}

//删除头节点

        if (index ==0) {

head =head.next;

return;

}

//遍历结点

        Node cur =head;

Node pre =null;

int position =0;

while (cur!=null){

if(index==position){

pre.next = cur.next;

//断开与节点的链接,jvm会回收

                cur.next =null;

return;

}

pre = cur;

cur = cur.next;

position++;

}

}

public void reverse(){

Node cur =head;//当前节点

        Node  pre =null;//标记当前节点的上一个节点。

        Node temp;

while (cur !=null){

//保存当前节点的下一个节点,将上一个节点和当前节点置换

            temp = cur.next;

cur.next=pre;

//pre、cur 继续后移

            pre = cur;

cur = temp;

}

head  = pre;

}

public int size(){

int size =0;

if(head==null){

return size;

}

Node cur =head;

while(cur!=null){

cur = cur.next;

size++;

}

return size;

}

@Override

    public String

    toString() {

return "SingleTest{" +

"head=" +head +

'}';

}

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,509评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,806评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,875评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,441评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,488评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,365评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,190评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,062评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,500评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,706评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,834评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,559评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,167评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,779评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,912评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,958评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,779评论 2 354

推荐阅读更多精彩内容