LinkList

第一节:单向链表:链表数据存储原有数据还有下一个数据的地址,用指针

  链表有许多相同类型的元素按照特定的顺序排列形成的线性表,最重要两个操作 插入、删除。优点:插入和删除十分方便。

在java中模拟节点,采用class建立一个节点,只能采用类代替C++中指针,只能够用first,last两个

Node类点节点来表示指针。

 1 class Node{
 2     int Data;
 3     Node next;//C语言中运用的是指针
 4     
 5     //构造函数初始化
 6     public Node(int Data)
 7          {
 8     this.Data=Data;this next=Null;
 9     }    
10 
11 }        

在java中没有指针类型,只能够用类代替指针。C++通过申请地址来进行下一个节点的链接。

BuffereadReader java中一个缓冲内,从外界输入的值先放入缓冲中,在写入内存,防止外界输入的被失去。

建立单向链表,包括其中插入和删除方法:

  1 package linklist;
  2 import java.io.*;
  3 public class CH03_1 {
  4 
  5     
  6     public static void main(String[] args) throws  IOException {
  7         // TODO Auto-generated method stub
  8         BufferedReader buff;//防止外界的值输入过快被舍弃
  9         buff=new BufferedReader(new InputStreamReader(System.in));
 10         
 11         int num;String name;int score;
 12         LinkList list=new LinkList();//本包之中Node中LinkList类
 13         System.out.println("输入5位同学的数据");
 14         for(int i=1;i<6;i++)
 15         {
 16             System.out.println("input the Student number:");
 17             num=Integer.parseInt(buff.readLine());
 18             
 19             System.out.println("input the Student name:");
 20             name=buff.readLine();
 21             
 22             System.out.println("input the Student Score:");
 23             score=Integer.parseInt(buff.readLine());
 24             
 25             
 26             list.Insert(score, name, num);
 27                     
 28         }
 29         list.print();
 30         Node delNode=new Node("xiao ming",70,3);
 31         list.remove(delNode);
 32         list.print();
 33         
 34     }
 35 
 36 }
 37 
 38  class Node {
 39     String name;
 40     int score,no;
 41     Node next;
 42     
 43     //构造函数初始化,模拟单个小节点
 44     public Node(String name,int score,int no)
 45     {
 46         this.name=name;
 47         this.score=score;
 48         this.no=no;
 49         this.next=null;
 50     }
 51 }
 52 
 53 class LinkList{
 54     //这两个东西表示指针
 55     private Node first;
 56     private Node last;
 57     public boolean isEmpty()
 58     {
 59         return first==null;
 60     }
 61     
 62     public void Insert(int Data,String name,int np)
 63     {
 64         Node newNode=new Node(name,Data,np);
 65         if(this.isEmpty())
 66         {
 67             this.first=newNode;
 68             this.last=newNode;
 69         }
 70         else
 71         {
 72             this.last.next=newNode;
 73             last=newNode;
 74         }
 75     }
 76     public void remove(Node delNode)
 77     {    Node newNode,tmp;
 78         //分为最前,中间和末尾三种方式删除
 79         if(first.no==delNode.no)
 80         {
 81             first=first.next;
 82         }
 83         else if(delNode.no==last.no)
 84         {
 85             //删除最后一个节点
 86             newNode=first;
 87             while(newNode.next!=last)
 88                 newNode=newNode.next;
 89             newNode.next=last.next;//指针移动到倒数第二个节点位置上,更新最后一个节点
 90             last=newNode;
 91             
 92             
 93         }
 94         else
 95         {
 96             newNode=first;tmp=first;
 97             while(newNode.no!=delNode.no)
 98             {
 99                 tmp=newNode;//截止条件在于newNode.no=delNode.no
100                 newNode=newNode.next;
101                 
102             }
103             System.out.println("newNode"+newNode.name);
104             tmp.next=delNode.next;
105         }
106     }
107     public void print()
108     {
109         Node current=first;
110         while(current!=null)
111         {
112             System.out.println("["+current.no+current.name+current.score+"]");
113             current=current.next;
114         }
115         System.out.println();
116     }
117 }

 //对单向列表反向,特别注意其中的反向:

 1 package linklist;
 2 
 3 public class CH03_03 {
 4 
 5     public static void main(String[] args) {
 6         // TODO Auto-generated method stub
 7       //写入函数进行test
 8     }
 9 
10 }
11 
12 class ReverseStudentLinkList extends StudentList{
13     //子类继承父类运用父类的方法:
14     public void print()
15     {
16         Node front=null;
17         Node current=first; 
18         Node nextNode=null;
19         
20         System.out.println("链表反向");
21         while(current!=null)
22         {
23             nextNode=current.next;//保存正向的顺序
24             current.next=front;
25             //向前移动
26             front=current;
27             current=nextNode;
28 
29             
30             
31         }
32         
33         //查看书上的利用first,current,last节点
34         while(current!=null)
35         {
36             last=front;
37             front=current;
38             current=current.next;
39             front.next=last;
40         }
41         
42         //j接下来直接遍历
43         current=front;
44         
45         while(current!=null)
46         {
47             System.out.println("["+current.no+current.name+current.score);
48             current=current.next;
49         }
50         System.out.println();
51         
52         
53     }
54     
55 }
原文地址:https://www.cnblogs.com/woainifanfan/p/6003350.html