【算法数据结构Java实现】Java实现单链表

简介: 1.背景          单链表是最基本的数据结构,仔细看了很久终于搞明白了,差不每个部分,每个链都是node的一个对象。需要两个参数定位:一个是index,表示对象的方位。另一个是node的对象。2.代码node类public class Node { protected Node next; protected int data; public Node(in

1.背景

          单链表是最基本的数据结构,仔细看了很久终于搞明白了,差不每个部分,每个链都是node的一个对象。需要两个参数定位:一个是index,表示对象的方位。另一个是node的对象。



2.代码


node类
public class Node {
	 protected Node next;
	 protected int data;
	 public Node(int data){
		 this.data=data;
	 }
	 public void display(){
     System.out.print(data+"");
   }
}

arraylist类
public class myArrayList {
      public Node first;//定义头结点
      private int pos=0;//节点位置
      public myArrayList(){
    	  // this.first=null;
      }
      //插入一个头结点
      public void addFirstNode(int data){
    	    Node node=new Node(data);
    	    node.next=first;
    	    first=node;
      }
      //删除头结点
      public Node deleteFirstNode(){
    	    Node tempNode=first;
    	    first=tempNode.next;
    	    return tempNode;
      }
      // 在任意位置插入节点 在index的后面插入  
      public void add(int index, int data) {  
           Node node = new Node(data);  
           Node current = first;  
           Node previous = first;  
            while ( pos != index) {  
               previous = current;  
               current = current. next;  
                pos++;  
           }  
           node. next = current;  
           previous. next = node;  
            pos = 0;  
      }  
      // 删除任意位置的节点  
      public Node deleteByPos( int index) {  
           Node current = first;  
           Node previous = first;  
            while ( pos != index) {  
                pos++;  
               previous = current;  
               current = current. next;  
           }  
            if(current == first) {  
                first = first. next;  
           } else {  
                pos = 0;  
               previous. next = current. next;  
           }  
            return current;  
      }     
      public void displayAllNodes() {  
          Node current = first;  
           while (current != null) {  
              current.display();
              System.out.println();
              current = current. next;  
          }            
     }  
      
}


实现的main函数:
public class Main {
   public static void main(String args[]){
	   myArrayList ls=new myArrayList();   	  
	   ls.addFirstNode(15);	   
	   ls.addFirstNode(16);
	   ls.add(1, 144);
	   ls.add(2, 44);
	   ls.deleteByPos(1);
	  ls.displayAllNodes();	   
   }
}



实现结果:

16

44

15


package LinkedList;   
  
/**  
 * <p><strong>我的Java单链表练习</strong></p>  
 * <p>单链表提供了在列表头的高效插入和删除操作,不过在单链表的末尾的插入操作效率很低.</p>  
 * <p>单链表指针域保存着下一节点的引用,尾结点的指针域等于null</p>  
 * @author baby69yy2000  
 */  
public class SingleLinkedList<T> {   
       
    /**  
     * 结点类  
     */  
    private static class Node<T> {   
        T nodeValue; // 数据域   
        Node<T> next; // 指针域保存着下一节点的引用   
           
        Node(T nodeValue, Node<T> next) {   
            this.nodeValue = nodeValue;   
            this.next = next;   
        }   
           
        Node(T nodeValue) {   
            this(nodeValue, null);   
        }   
    }   
  
    // 下面是SingleLinkedList类的数据成员和方法   
    private Node<T> head, tail;   
       
    public SingleLinkedList() {   
        head = tail = null;   
    }   
       
    /**  
     * 判断链表是否为空  
     */  
    public boolean isEmpty() {   
        return head == null;   
    }   
       
    /**  
     * 创建头指针,该方法只用一次!  
     */  
    public void addToHead(T item) {   
        head = new Node<T>(item);   
        if(tail == null) tail = head;   
    }   
       
    /**  
     * 添加尾指针,该方法使用多次  
     */  
    public void addToTail(T item) {   
        if (!isEmpty()) { // 若链表非空那么将尾指针的next初使化为一个新的元素   
            tail.next = new Node<T>(item); // 然后将尾指针指向现在它自己的下一个元素   
            tail = tail.next;   
        } else { // 如果为空则创建一个新的!并将头尾同时指向它   
            head = tail = new Node<T>(item);         
        }   
    }   
       
    /**  
     * 打印列表  
     */  
    public void printList() {   
        if (isEmpty()) {   
            System.out.println("null");   
        } else {   
            for(Node<T> p = head; p != null; p = p.next)   
                System.out.println(p.nodeValue);   
        }   
    }   
       
    /**  
     * 在表头插入结点,效率非常高  
     */  
    public void addFirst(T item) {   
        Node<T> newNode = new Node<T>(item);   
        newNode.next = head;   
        head = newNode;   
    }   
       
    /**  
     * 在表尾插入结点,效率很低  
     */  
    public void addLast(T item) {   
        Node<T> newNode = new Node<T>(item);   
        Node<T> p = head;   
        while (p.next != null) p = p.next;   
        p.next = newNode;   
        newNode.next = null;   
    }   
       
    /**  
     * 在表头删除结点,效率非常高  
     */  
    public void removeFirst() {   
        if (!isEmpty()) head = head.next;   
        else System.out.println("The list have been emptied!");   
    }   
       
    /**  
     * 在表尾删除结点,效率很低  
     */  
    public void removeLast() {   
        Node<T> prev = null, curr = head;   
        while(curr.next != null) {   
            prev = curr;   
            curr = curr.next;   
            if(curr.next == null) prev.next = null;   
        }   
    }   
       
    /**  
     * <p>插入一个新结点</p>  
     * <ul>插入操作可能有四种情况:  
     * <li>①表为空, 返回false</li>  
     * <li>②表非空,指定的数据不存在</li>  
     * <li>③指定的数据是表的第一个元素</li>  
     * <li>④指定的数据在表的中间</li></ul>  
     * @param appointedItem 指定的nodeValue  
     * @param item 要插入的结点  
     * @return 成功插入返回true;  
     */  
    public boolean insert(T appointedItem, T item) {   
        Node<T>  prev = head, curr = head.next, newNode;   
        newNode = new Node<T>(item);   
        if(!isEmpty()) {   
            while((curr != null) && (!appointedItem.equals(curr.nodeValue))) { //两个判断条件不能换   
                prev = curr;   
                curr = curr.next;   
            }   
            newNode.next = curr; //②③④   
            prev.next = newNode;   
            return true;    
        }   
        return false; //①   
    }   
       
    /**  
     * <p>移除此列表中首次出现的指定元素</p>  
     * <ul>删除操作可能出现的情况:  
     * <li>①prev为空,这意味着curr为head. head = curr.next; --> removeFirst();</li>  
     * <li>②匹配出现在列表中的某个中间位置,此时执行的操作是 --> prev.next = curr.next;,</li></ul>  
     * <p>在列表中定位某个结点需要两个引用:一个对前一结点(prev左)的引用以及一个对当前结点(curr右)的引用.</p>  
     * prev = curr;  
     * curr = curr.next;  
     */  
    public void remove(T item) {   
        Node<T> curr = head, prev = null;   
        boolean found = false;   
        while (curr != null && !found) {   
            if (item.equals(curr.nodeValue)) {   
                if(prev == null) removeFirst();   
                else prev.next = curr.next;   
                found = true;   
            } else {   
                prev = curr;   
                curr = curr.next;   
            }   
        }   
    }   
       
    /**  
     * 返回此列表中首次出现的指定元素的索引,如果列表中不包含此元素,则返回 -1.  
     */  
    public int indexOf(T item) {   
        int index = 0;   
        Node<T> p;   
        for(p = head; p != null; p = p.next) {   
            if(item.equals(p.nodeValue))   
                return index;   
            index++;   
                   
        }   
        return -1;   
    }   
       
    /**  
     * 如果此列表包含指定元素,则返回 true。  
     */  
     public boolean contains(T item) {   
         return indexOf(item) != -1;   
     }   
       
    public static void main(String[] args) {   
        SingleLinkedList<String> t = new SingleLinkedList<String>();   
        t.addToHead("A");   
        //t.addFirst("addFirst");   
        t.addToTail("B");   
        t.addToTail("C");   
        System.out.println(t.indexOf("C")); // 2   
        System.out.println(t.contains("A")); // true   
        //t.addLast("addLast");   
        //t.removeLast();   
        //t.insert("B", "insert");   
        //t.removeFirst();   
        //t.remove("B"); // A C   
        t.printList(); // A B C   
           
    }   
  
}  



/********************************

* 本文来自博客  “李博Garvin“

* 转载请标明出处:http://blog.csdn.net/buptgshengod

******************************************/


目录
相关文章
|
21天前
|
机器学习/深度学习 算法 数据挖掘
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构。本文介绍了K-means算法的基本原理,包括初始化、数据点分配与簇中心更新等步骤,以及如何在Python中实现该算法,最后讨论了其优缺点及应用场景。
66 4
|
2月前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
91 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
19天前
|
数据采集 存储 算法
Python 中的数据结构和算法优化策略
Python中的数据结构和算法如何进行优化?
|
27天前
|
算法
数据结构之路由表查找算法(深度优先搜索和宽度优先搜索)
在网络通信中,路由表用于指导数据包的传输路径。本文介绍了两种常用的路由表查找算法——深度优先算法(DFS)和宽度优先算法(BFS)。DFS使用栈实现,适合路径问题;BFS使用队列,保证找到最短路径。两者均能有效查找路由信息,但适用场景不同,需根据具体需求选择。文中还提供了这两种算法的核心代码及测试结果,验证了算法的有效性。
89 23
|
18天前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
48 1
|
27天前
|
算法 vr&ar 计算机视觉
数据结构之洪水填充算法(DFS)
洪水填充算法是一种基于深度优先搜索(DFS)的图像处理技术,主要用于区域填充和图像分割。通过递归或栈的方式探索图像中的连通区域并进行颜色替换。本文介绍了算法的基本原理、数据结构设计(如链表和栈)、核心代码实现及应用实例,展示了算法在图像编辑等领域的高效性和灵活性。同时,文中也讨论了算法的优缺点,如实现简单但可能存在堆栈溢出的风险等。
39 0
|
2月前
|
存储 算法 Java
Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定数据结构和算法确保元素唯一性
Java Set因其“无重复”特性在集合框架中独树一帜。本文解析了Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定数据结构和算法确保元素唯一性,并提供了最佳实践建议,包括选择合适的Set实现类和正确实现自定义对象的hashCode()与equals()方法。
41 4
|
2月前
|
存储
[数据结构] -- 单链表
[数据结构] -- 单链表
26 1
|
2月前
|
算法 搜索推荐 Java
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
这篇文章介绍了如何使用Java后端技术,结合Graphics2D和Echarts等工具,生成包含个性化信息和图表的海报,并提供了详细的代码实现和GitHub项目链接。
141 0
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
|
2月前
|
搜索推荐 算法
数据结构与算法学习十四:常用排序算法总结和对比
关于常用排序算法的总结和对比,包括稳定性、内排序、外排序、时间复杂度和空间复杂度等术语的解释。
25 0
数据结构与算法学习十四:常用排序算法总结和对比