挑战程序设计竞赛(算法和数据结构)——4.4链表习题的Java实现
Posted 小乖乖的臭坏坏
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了挑战程序设计竞赛(算法和数据结构)——4.4链表习题的Java实现相关的知识,希望对你有一定的参考价值。
链表有初始化、插入元素、删除元素、查找元素等方法。在创建链表的过程中,最关键的是搞清楚链表的几个关键数据构成:链表由一个个节点互相串联构成,节点作为一个基础的对象,可由类Node(随便取个名字都行)来声明。节点中包含三个值,key(int)用于存储数据值的大小、prev(Node)用作指针指向上一个节点、next(Node)用作指针指向下一个节点。
本文实现的双向链表,在初始化时,头节点nil的prev和next指针均指向自己。而在插入元素时,则比较讲究,可以参考下图:
实现代码如下:
Main.java
public class Main {
public static void main(String[] args) {
BidirectionalLinkedList LinkedList = new BidirectionalLinkedList();
LinkedList.insert(1);//链表添加元素
LinkedList.insert(3);
LinkedList.insert(9);
LinkedList.insert(8);
LinkedList.insert(4);
LinkedList.insert(7);
LinkedList.insert(2);
LinkedList.show();//实现链表的遍历
// //实现链表的搜索
// BidirectionalLinkedList.Node cur = LinkedList.listSearch(2);
// System.out.println("查找元素为:" + cur.key);
//实现链表的删除节点
System.out.println("删除第一个元素...");
LinkedList.deleteFirst();
LinkedList.show();
System.out.println("删除最后一个元素...");
LinkedList.deleteLast();
LinkedList.show();
System.out.println("删除元素9...");
LinkedList.deleteKey(9);
LinkedList.show();
}
}
public class BidirectionalLinkedList {
class Node{//节点的定义
int key=Integer.MIN_VALUE;
Node prev, next;
}
Node nil = new Node();
//链表初始化
BidirectionalLinkedList(){
this.nil.next = this.nil;
this.nil.prev = this.nil;
}
//链表的遍历
public void show(){
BidirectionalLinkedList.Node head_nil = this.nil;
System.out.println("链表中的元素为:");
while(this.nil.next != head_nil){
System.out.print(this.nil.next.key + " ");
this.nil = this.nil.next;
}
System.out.println("");
this.nil = head_nil;//遍历完要把头指针指回来
}
//插入元素
public void insert(int key){
Node x = new Node();
x.key = key;
//在头节点后添加元素
x.next = nil.next;
nil.next.prev = x;
nil.next = x;
x.prev = nil;
}
public Node listSearch(int key){
Node cur = new Node();
cur = nil.next;//从头节点后面的元素开始访问
while(cur!=nil && cur.key!=key){
cur = cur.next;
}
return cur;
}
public void deleteNode(Node t){
if(t==nil)return;//t未为头节点时不做处理
t.prev.next = t.next;
t.next.prev = t.prev;
}
public void deleteFirst(){
deleteNode(nil.next);
}
public void deleteLast(){
deleteNode(nil.prev);
}
public void deleteKey(int key){
//删除搜索到的节点
deleteNode(listSearch(key));
}
}
代码输出结果为:
链表中的元素为:
2 7 4 8 9 3 1
删除第一个元素...
链表中的元素为:
7 4 8 9 3 1
删除最后一个元素...
链表中的元素为:
7 4 8 9 3
删除元素9...
链表中的元素为:
7 4 8 3
作于:
2021-11-8
14:41
以上是关于挑战程序设计竞赛(算法和数据结构)——4.4链表习题的Java实现的主要内容,如果未能解决你的问题,请参考以下文章
挑战程序设计竞赛(算法和数据结构)——分割(下)&快速排序的JAVA实现
挑战程序设计竞赛(算法和数据结构)——19.2九宫格拼图问题的JAVA实现
挑战程序设计竞赛(算法和数据结构)——7.1归并排序JAVA实现
挑战程序设计竞赛(算法和数据结构)——16.13线段相交问题(曼哈顿算法)的JAVA实现