【CSE 104 – Assignment 01 – Java单链表建立】

来源:互联网 发布:mediawiki 数据库配置 编辑:程序博客网 时间:2024/06/08 06:40

【CSE 104 – Assignment 01 – Java单链表建立】

-------Author : Stephen Bo

(本文章仅供大家分享与学习使用~  Thank You!~~   O(∩_∩)O哈哈~)

一、 先简单介绍一下单链表:

单链表是最简单的链表,有节点之间首尾连接而成(单链表中的末尾节点中的指针域可以为空指针,也可以让空指针指向链表头节点,视情况而建立),这次作业中末尾节点中的指针域赋空指针即可,因为没有必要让末尾节点指向链表头节点地址。

(单链表示意图,如图)

二、 链表中的节点:

节点其实用C语言就是一个结构体,即可以将不同类型的数据放在一个变量名下(数组就是将相同类型的数据放在一个变量名下)。正因为这么做是因为链表中的每个节点有两个不同类型的数据构成,一个数据是节点中的数据域(数据域的类型视链表的类型而定,若链表中的数据为int型,则数据域就为int型), 另一个数据是指针域(java中没有专门的指针变量,而是用对象来记录地址的,也就是说java每建立一个对象都会把对象的地址值放入栈中,然后将对象中的数据在堆里面开辟内存,软对象是一个方法,则堆里面也会保存方法中代码区的地址值,该地址值指向内存中该方法的代码区)。

三、 定义一个链表对象:

链表对象用:

        Public classname<T>

        {

                          …..

}

                  这个语句来建立,其中name为链表名,T为链表数据类型。

四、 定义链表中的节点:

链表中的节点用在链表对象中建立一个子类来表示节点,节点中包含两个数据,一个是数据域,一个是指针域。如下:

        Public classname<T>

        {

                          Privateclass Node<T>

                          {

                                            Tdata; //用java语言定义数据域

                                            Node<T>pointer;//用java定义指针域

                                            PublicNode(T data , Node<T> Pointer)

                                            {

                                                              This.data= data;

                                                              This.pointer= pointer;

}

Public Node(T data)

{

            This(data , null);

}

//当建立新的节点时,为节点中的数据域赋值。并将指针域赋值为空

}

}

Private Node<String> head,nail;

/*定义两个节点对象,分别表示链表中的头节点域末尾节点,在操作链表时用这两个节点就可以操作整个链表了!~*/

五、 操作链表:

1、在操作链表时,我们第一个方法肯定要判定此链表到底有没有数据,因为一个没有数据的链表其他操作方法又有什么意义呢?

public boolean isEmpty( )

{

                  returnhead == null;

}

正因为判定head等不等于空,就是在判定有没有为链表中第一个节点开内存,若没有为第一个节点中的数据域赋值,那么head节点就是构造方法赋的null值,若为第一个节点中的数据域赋值,那么计算机就为第一个节点开了内存,head就不是空。 因而若head为空那么就是空链表,若不是空那么就是一个有数据的链表。

2、判定完是不是空链表,当然就是为链表中的节点赋值了:

每次赋值时都要先为节点中的数据域赋值,然后将上一节点的指针域赋值为现在这个节点的地址值(因为每次开一个节点,节点的指针域是空值。。。)。不多说,上代码:

Public void add(T item)

{

                  If(head== null)

                  {

                                    head= tail = new Node<T>(item);

}

/*若头节点为空,那么链表是一个空链表,就要为第一个节点赋值,首先将头节点中的数据域用节点中的构造方法赋值为item,然后节点中的指针域就是item的地址了,然后需要让尾节点等于头节点,以便赋值下一个节点,因为头结点无论如何不能变化*/

Else

{

        tail.pointer = new Node<T>(item);

        tail = tail.pointer;

}

/*若头结点不为空,则表明该链表不是一个空链表,即此时赋值不是为第一个元素赋值那么先将此时尾节点中的指针域变为新元素地址值,然后再将尾节点的数据域用构造方法赋值为item,指针域赋值为null即可*/

}

3、删除链表中节点:

(1)先说下删除链表中的节点跟删除数组中的元素相比都有哪些好处吧:

数组在计算机中的存储方式是以数组第一个索引0开始开内存然后开一条连续的内存以便存放数组中的元素,当删除数组中的某个元素时,那么该元素后的所有元素都要向前移动一位,这样Best Case的情况下,是删除数组中最后一个元素,没有任何元素需要移动,时间复杂度为O(1),但是average case 与 worst case的情况下就要将数组中n个元素向前移动一位,则时间复杂度就为O(n)。

但是在删除链表中的节点(类似于数组中的元素)时,只需要将链表中上一节点的指针域直接跳过要删除节点的地址指向要删除节点的下一个节点即可,则时间复杂度为O(1),即worst case情况下也只有常数级的复杂度。

(2)OK!~ 上代码:

public void remove(T item)

      {

            Node<String> pointer = head , temp=null;

            for(pointer =head; pointer != null ;pointer = pointer.nextPointer)

            {

                  if(item.equals(pointer.data))

                  {

                        if(temp !=null)

                              temp.nextPointer = pointer.nextPointer;

                        else

                              head =head.nextPointer;

                  }

                  else

                  {

                        temp = pointer;

                        temp.nextPointer = pointer.nextPointer;

                  }

            }

      }

该方法写了删除链表中等于某个值的节点,如果想删除某个索引的节点的话,定义一个记录变量,当记录变量等于要删除索引的值时,用上面的方法切换指针域的指向即可。

4、其他操作链表的方法:

链表中的节点可以插入某个节点,可以从链表中得到某个节点数据域的值,也可以将链表转换为数组等等~

Assignment01 如果想要自己建立链表拿建立链表的10分的话,根据自己的程序思路,和链表节点的操作方法再自己写几个能够用的到的链表操作方法就可以了。

 

看完这篇文章再自己研究一下应该自己建立链表会方便很多~ 与君共勉!~                                  

【End、】

0 0
原创粉丝点击