• 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 }
  • 相关阅读:
    C++内存分配
    扩展哈夫曼编码
    用递归函数和栈操作逆序一个栈
    非递归遍历二叉树
    malloc/free和new/delete
    洗牌算法及其证明
    野指针问题
    计算编辑距离
    数组指针/指针数组的使用
    sizeof/strlen/length
  • 原文地址:https://www.cnblogs.com/woainifanfan/p/6003350.html
Copyright © 2020-2023  润新知