数据结构之双向链表的Java实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构之双向链表地Java 实现
单链表只能从前往后遍历,如果链表地长度较大, 遍历到链表后半部分地时候想要往前查找,就只能回到开头,重新遍历了.
双向链表提供了这个能力, 即允许前向遍历, 也允许后向遍历整个链表. 原因是双向链表地每个节点都有两个指向其他节点地引用. 但这也是其缺点, 因为在插入、删除地时候需要处理四个链接点地引用, 占用地空间也大了一些. 如将头节点和尾节点链接起来, 即成为双向循环链表. b5E2RGbCAP
下面是java 代码:
package test 。
public class DoubleLink {
public Link first 。
public Link last 。
public DoubleLink< ) {// 构造器, 初始化
this.first = null 。
st = null 。
}
public boolean isEmpty< ) {// 判断是否为空
return first == null 。
}
public void insertFirst<int idata ) {// 将元素插入链表开头Link link = new Link<idata );
if <isEmpty< ))
last = link 。
// 如果为空,last 需要改变
else
link.next = first 。
first = link 。
}
public void insertLast<int idata ){// 插入链表结尾
Link link = new Link<idata );
if <isEmpty< ))
first = link 。
else
last.next = link 。
link.previous = last 。
last = link 。
}
public boolean insertAfter<int key, int idata
在某项元素后
) {//
插入p1EanqFDPw
Link current = first 。
while <current.idata != key ) {// 从头开始查找
current = current.next 。
if <current == null ) // 到表尾也没有找到
return false 。
}
Link link = new Link<idata );
if <current == last ) {
link.next = null 。
last = link } else { link.next = current.next current.next.previous = link }
link.previous = current current.next = link 。
return true 。
}
public Link delectKey<int key Link current = first 。
while
<current.idata != key
current = current.next 。
if <current == null ) return null 。
}
if <current == first )
first = current.next 。
else
current.previous.next = current.next if <current == last )
last = current.previous 。
else
current.next.previous = current.previous ) {// 删除某项元
素
return current
public Link delectFirst< {// 删除链表开头元素
Link temp = first
Link temp = last 。
if <first.next == null
first = null 。
else
last.previous.next = null
last = last.previous
return temp 。
Link current = last 。
while <current != null if <first.next == null // 只有一个元素
last = null 。
else
first.next.previou s = null previous 字段
DXDiTa9E3d。
//first 节点地 next 字段引用地链节点地 first = first.next
return temp 。
public Link delectLast< {// 删除链表最后地元素
public void showFirst< {// 前向展示
current.showLink< );
current = current.previous 。
}
}
public void showLast< ){// 后向展示Link current = first 。
while <current != null ){
current.showLink< );current =
current.next 。
}
}
public static void main<String[] args ){ DoubleLink dlink = new DoubleLink< );dlink.insertFirst<1 );
dlink.insertFirst<2 );
dlink.insertFirst<3 );
dlink.showFirst< );
dlink.insertLast<4 );
dlink.insertLast<5 );
dlink.showFirst< );
}
}
class Link {
public int idata // 存放地数据
public Link previous public Link next 。
// public Link<int idata this.idata = idata 。
}public void showLink<
// 对前一项地引用对后一项地引用 ) {
) {
System.out.print<idata +
);" "。