黑马程序员-数据结构-链表、栈、队列、树

----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

在java中集合类有ArrayList、Linklist、Set、Hashtable、HashMap等

通常情况下这些集合类足够我们使用了。

而本文讲的是从数据结构基础来看链表、栈、队列、树这些对象。

前.节点Node

节点是存储数据的基本单位。也是下面这些对象的基本组成部分。

最简单的节点由2部分组成:1储存的数据;2下一个节点;

public class Node {
        public int _intValue;//数据
        public Node next;//下一个节点
}


数据结构中还有双向链表和树。双向链表的节点中还应该多前一个节点:

public class Node {
        public int _intValue;//数据
        public Node next;//下一个节点
        public Node previous;//前一个节点
}


树型结构的话比较复杂,我们之看简单的二叉树:即只有2条子树的树

它的节点为:

public class Node {
        public int _intValue;//数据
        public Node left;//左节点
        public Node right;//右节点
}


1.链表LinkList

链表结构为线性结构,链表中之存储头节点。

任意节点都可以通过头结点依次往下一个节点搜寻到。

链表该有基础的插入节点、删除节点、清空链表的方法。

public class Link {
        public Node head;

public void insert(Node node, int position){//插入节点node和插入位置
if(head == null){
head = node;
return;
}
Node p = head;
int count = 1;
while(p.next != null && count < position){
p = p.next;
}
node.next = p.next;
p.next = node;
}
       
        public void delete(int position){//删除position位置的节点
               if(head == null){
                       return;
               }
               Node p = head;
               int count = 1;
               while(p.next != null &&count < position){
                       p = p.next;
               }
               p.next = p.next.next;
        }
       
        public void clear(){//清空链表
               head = null;
}
}


链表还可以设计成排序的,插入按大小插入、删除还可以按节点删除,方法可以设计多种多样。

2.栈Stack

栈也是线性数据结构,遵循先进后出、后进先出的原则。

只需要一个标记记住最后入栈的节点就行。

方法也较为简单:出栈和入栈。

public class Stack {
        public Node p;
       
        public void push(Node node){
               if(p == null) p = node;
               else{
                       node.next = p;
                       p = node;
               }
        }
       
        public Node pull(){
               if(p == null){
                       System.err.println("nullStack!");
                       return null;
               }
               Node node = null;
               node = p;
               p = p.next;
               node.next = null;
               return node;
        }
       
}


3.队列Queue

队列和栈很像,但是它遵循的原则是先进先出,后进后出。

设置头节点和尾节点方便操作。

方法也只有进队列和出队列。

public class Queue {
        public Node head;
        public Node tail;//尾
       
        public void enQueue(Node node){//进队列
               if(head == null && tail== null){
                       head = tail = node;
               }else{
                       tail.next = node;
                       tail = node;
               }
        }
       
        public Node deQueue(){//出队列
               Node node = null;
               if(head == null && tail== null){
                       System.out.println("nullQueue");
               }else if(head == tail){
                       node = head;
                       head = tail = null;
               }else{
                       node = head;
                       head = head.next;
               }
               return node;
        }
}


4.树Tree

树需要一个根节点,标明树根。

public classBinaryTree {
        TreeNode _root;
}


树的方法较为复杂,增删查都需要遍历整棵树

树的遍历又分为深度优先遍历(Depth-first Traversal)和广度优先遍历(Breadth-firsttraversal)。

广度优先遍历需要借助队列。

深度优先遍历又可分为:前序遍历(Preorder Traversal),后序遍历(Postorder Traversal)和中序遍历(Inorder Traversal)

 

较为复杂...就不写代码了....

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值