java中单项链表实现方法:增加、删除、插入数据

本文转自http://www.bianceng.cn/Programming/sjjg/201407/42457.htm,作者不详。

java的API里面已经提供了单向链表的类,大家可以直接拿来用,不过学习数据结构课程的时候想必大家也已经知道,虽然系统会给我们提供一些常用的数据结构,但是自定义的总是能够带来不同的喜感的,而且通过自己的编写也更能够让我们了解其中实现的过程,而且我们还可以写一些比较个性化的方法作为属于自己的数据结构。这里主要是介绍一些常用结构里面都会用到的方法,以及链表具体是如何操作的。

首先,单链表相对于队列的优势在于存储地址不是连续的,这样的意义在于,操作其中的某一个位置的元素时不需要对之前的其他元素都进行内存操作,大大的为我们的计算机减压了。下面直接进入正题:

先要定义一个结点类,如下:

Java代码


public class Node {  
        Node next;//下一个结点的引用  
        Object obj;//结点元素  
        public Node(Object obj){  
            this.obj=obj;  
        }  
}

然后就是我们的LinkedList类,先要定义一个空链表:

Node head=null;//创建一个空链表,头结点

Node last=head;//尾结点

打印链表有两种方法,可以采用递归,也可以使用非递归的方法,如下:

Java代码

/** 
* 非递归打印元素的方法 
*/
public void print(Node head){  
    while(head!=null){  
        System.out.println(head.obj);  
        head=head.next;//索引向后移位  
    }  
}  
/** 
 * 递归打印链表元素的方法 
 */
public void printNode(Node head){  
    if(head!=null){  
        System.out.println(head.obj);  
        Node node=head.next;  
        printNode(node);//递归调用  
    }  
}

非递归方法有一个致命的缺陷,打印的同时改变了头结点的位置,所以我们应该倾向于使用递归方法。

说了这么多,增删查改正式开始:

向链表中添加元素。判断一个链表已经到达末尾的依据是该结点的next引用已经为Null,所以要向末尾添加一个结点,先要把新增结点放在最后,再把末尾结点向后移位,具体操作过程如下图:      

代码如下:

Java代码

/** 
 * 向指定链表添加元素的方法 
 * @param obj   插入的元素 
*/
public void add(Object obj){  
    Node node=new Node(obj);//新建结点   
    if(head==null){//如果链表为空  
        head = node;  
    }else{  
        last.next=node;//先把新增结点放在最后  
    }  
    last=node;//再把最后一个结点向后移位  
}

插入元素。要插入一个新元素首先要创建一个新结点来存放它,而在具体实现的时候最让人头疼的时候无疑是怎样找到指定位置的索引了,这里所说的方法在下面的其他操作基本上都是这样衍生的,先了解一下插入结点的具体实现,根据这个结构的逻辑定义,如果我们要在结点A之后插入一个结点,那么就还需要修改结点A的next引用,实际上就是让A结点的next引用指向新增结点的元素域,然后再让新增结点的next引用指向A原本next结点(B)的元素域,用图来表示更加直观:



代码如下:

Java代码


/** 
 * 向链表中插入新元素的方法  
*/
public void insert(int index,Object obj){  
    Node node=head;  
    int j=0;  
    while(node!=null&&j<index-2){  
        //查找到第index-1个元素  
        node=node.next;  
        j++;  
    }  
    Node sert=new Node(obj);//被插入的结点  
    sert.next=node.next;  
    node.next=sert;  
}

代码如下:

Java代码



删除元素。知道了插入元素的具体操作之后,删除元素就显得相对简单了,比如说我们要删除一个结点b,就是要使这个结点失去引用,但是注意不要直接写b=b.next,这样的话b的引用还是存在,而且还会出现另一种错误,大家可以自己试一下,如图所示,正确的删除结点的方法如下:

代码如下:

Java代码

/** 
 * 删除指定位置的结点 
 * @param index 索引 
 */
public void delete(int index){  
    Node node=head;  
    int j=0;  
    while(node!=null&&j<index-2){  
        //查找到第i-1个元素  
        node=node.next;  
        j++;  
    }  
    node.next=node.next.next;//删除第index个元素  
}

查看本栏目更多精彩内容:http://www.bianceng.cn/Programming/sjjg/

最后就是修改元素了。相信大家看完之前的两个方法,接下来的这个方法在心中早就已经泛起波澜了吧,那下面就直接贴代码了:

Java代码

/** 
* 改变指定位置的元素 
 * @param index 索引 
 * @param obj    
 */
public void modify(int index,Object obj){  
    Node node=head;  
    int j=0;  
    while(node!=null&&j<index-1){  
        //找到第index个结点  
        node=node.next;  
        j++;  
    }  
    node.obj=obj;  
}


 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java,单向链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。单向链表的特点是只能从头节点开始遍历到尾节点,不能反向遍历。 下面是一个简单的Java实现单向链表的例子: ```java public class Node { int data; // 节点数据 Node next; // 指向下一个节点的指针 public Node(int data) { this.data = data; this.next = null; } } public class LinkedList { Node head; // 链表头节点 public LinkedList() { this.head = null; } // 在链表尾部添加节点 public void add(int data) { Node newNode = new Node(data); if (head == null) { head = newNode; } else { Node current = head; while (current.next != null) { current = current.next; } current.next = newNode; } } // 在链表查找某个节点是否存在 public boolean contains(int data) { Node current = head; while (current != null) { if (current.data == data) { return true; } current = current.next; } return false; } // 删除链表第一个出现的指定节点 public void remove(int data) { if (head == null) { return; } if (head.data == data) { head = head.next; return; } Node current = head; while (current.next != null) { if (current.next.data == data) { current.next = current.next.next; return; } current = current.next; } } // 获取链表的节点数 public int size() { int count = 0; Node current = head; while (current != null) { count++; current = current.next; } return count; } } ``` 在上面的代码,Node类表示链表节点,LinkedList类表示单向链表。它包含了添加、查找、删除和获取节点数等常见操作。你可以根据自己的实际需求来对链表进行操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值