比如说链表,概念上说就是一组结点构成的数据结构,其中每个结点均带有后续结点信息。各种语言都可以实现链表,但实现的思路都是基于上面的逻辑概念。
因此,学习数据结构不必拘泥于某种特定语言,归根结底是要把握每个数据结构(逻辑上)的精髓
在这个基础上,每种语言都可以实现特定的数据结构,差别只在于语法实现级别。
另外虽然Java/C++等语言都带有大量的标准类库,但这并不意味着可以忽视数据结构基础理论的学习。这直接关系到实际应用时,是只能死板套用现成模板,还是灵活应用各种结构高效实现需求。
《数据结构与抽象java语言描述第四版》百度网盘pdf最新全集下载:
链接:https://pan.baidu.com/s/163N0AXhLT3hc2vetn8tzgw
?pwd=2kfx 提取码:2kfx简介:本书是一本数据结构的教材,Java语言与数据结构两条知识主线贯穿始终,这两条主线既相互独立又相互支撑。本书介绍了计算机编程中使用的数据结构和算法,包括29章,
每章涉及一个ADT或其不同实现的规格说明和用法;书中贯穿9个Java插曲,涉及Java的高级特性。本书主要讲述了组织数据、设计类、包、栈、递归、排序、队列、双端队列、
优先队列、线性表、有序表、查找、字典、散列、树、二叉查找树、堆、平衡查找树、图等内容,并对算法的效率进行了分析。本书非常适合作为大学本科生数据结构课程的教材,也可作为计算机研究与开发人员的参考书。
package game24.datastructure.list/**
* 链表的结点
* @author luoweifu
*
*/
class Node{
Object data //数据元素
Node next //后驱结点
public Node() {
this(null)
}
public Node(Object data) {
this.data = data
this.next = null
}
}
/**
* 带头结点的链式链表,下标从0开始
* @author Administrator
*
*/
public class SinglyLinkedList<E>{
Node head //头结点
int size //链表的大小
public SinglyLinkedList() {
head = new Node()
size = 0
}
public SinglyLinkedList(E[] datas) {
int n = datas.length
head = new Node()
Node p = head
for(int i=0 i<n i++) {
p.next = new Node(datas[i])
p = p.next
}
size = n
}
public SinglyLinkedList(SinglyLinkedList list) {
head = list.head
size = list.size()
}
public void add(Object e) {
Node p
if(0 == size) {
p = head
} else {
p = index(size-1)
}
p.next = new Node(e)
size ++
}
public void concat(SinglyLinkedList list) {
Node lastNode = this.index(size - 1)
lastNode.next = list.index(0)
size += list.size()
}
public void clear() {
head.next = null
size = 0
}
public Object get(int i) {
Node p = index(i)
return p.data
}
private Node index(int i) {
Node p = null
if(i>=0 && i<size){
p = head
for(int j=0 j<=i j++) {
p = p.next
}
}
return p
}
public int indexOf(Object e) {
Node p = head.next
int i = 0
while(!p.data.equals(e)) {
p = p.next
i++
}
if(i<size)
return i
else
return -1
}
public void insert(int i, Object e) {
Node p = index(i)
Node p2 = new Node(e)
p2.next = p.next
p.next = p2
size ++
}
public boolean isEmpty() {
if(size ==0)
return true
else
return false
}
public int lastIndexOf(Object e) {
int i = size-1
while(!get(i).equals(e)) {
i--
}
if(i>=0)
return i
else
return -1
}
public void remove(int i) {
if(i>=0 && i<size) {
Node p = null
if(i == 0)
p = head
else {
p = index(i-1)
}
p.next = index(i).next
}
size --
}
public void set(int i, Object e) {
Node p = index(i)
p.data = e
}
public int size() {
return size
}
@Override
public boolean equals(Object obj) {
SinglyLinkedList list = (SinglyLinkedList)obj
if(this == obj && size == list.size) {
return true
}
return false
}
/**
* 测试线性表
* @param args
*/
public static void main(String args[]) {
//List list = new LinkList()
//List list = new DoubleLinkList()
SinglyLinkedList list1 = new SinglyLinkedList()
for(int i=0 i<10 i++) {
list1.add(new Integer(i))
}
Integer [] a = {101, 102, 103, 104, 105, 106, 107, 108, 109, 110}
SinglyLinkedList list = new SinglyLinkedList(a)
list.remove(9)
System.out.print("size:" + list.size() + "\n")
System.out.println("isEmpty:" + list.isEmpty())
System.out.print("第7个位置的元素:" + list.get(7) + "\n")
list.concat(list1)
for(int i=0 i<list.size() i++) {
System.out.print(list.get(i) + " ")
}
list.add(21)
list.add(22)
list.insert(3, new Integer(5))
System.out.print("size:" + list.size() + "\n")
System.out.print("第一次出现5的索引:" + list.indexOf(5) + "\n")
System.out.print("最后一次出现5的索引:" + list.lastIndexOf(5) + "\n")
list.set(0, new Integer(30))
for(int i=0 i<list.size() i++) {
System.out.print(list.get(i) + " ")
}
SinglyLinkedList list2 = list
System.out.println("\n is equels? " + list2.equals(list))
}
}