导航:首页 > 源码编译 > java链表算法

java链表算法

发布时间:2023-01-20 14:16:53

java版递归算法实现单链表的求长度、查找、替换等操作

首先,你实现链表的时候肯定是有一个变量记录链表大小的,求长度,直接获取链表大小就可以。
查找:有两种,一种是下标查找,还有一种是对象查找。其实底层归根结底都是用的index下标查找。 替换也是同道理。你要明白链表的原理,我相信你就不会问递归去做这些操作。
因为你查找只要给出下标,直接在for循环在0到你给定的下标内循环就能取到,如果你给的下标在链表大小/2 的后半部分,你可以倒序循环;当然这只是一种思路,希望能帮到你

⑵ 用java单链表实现一元多项式相加的算法。()

public class Test {
public static void main(String[] args) {
try{
LinkList list1 = new LinkList();
LinkList list2 = new LinkList();
LinkList list3 = null;

list1.addAt(0, new Item(1, 5));
list1.addAt(1, new Item(-1.5, 3));
list1.addAt(2, new Item(1, 1));

list2.addAt(0, new Item(0.5, 5));
list2.addAt(1, new Item(0.5, 4));
list2.addAt(2, new Item(1.5, 3));
list2.addAt(3, new Item(3, 0));

list3 = mergeLinkList(list1, list2);

System.out.println("一元多项式的相加过程:");
list1.listAll();
System.out.println(" + ");
list2.listAll();
System.out.println(" = ");
list3.listAll();
}
catch(Exception e){
e.printStackTrace();
}
}

//两个一元多项式相加,返回新的一元多项式
public static LinkList mergeLinkList(LinkList list1, LinkList list2){
int i = 0;
Item item = new Item();
Node curr1, curr2;
LinkList list3 = new LinkList();

curr1 = list1.getHead().getNext();
curr2 = list2.getHead().getNext();
while(curr1 != null && curr2 != null){
if(curr1.getData().getExp() > curr2.getData().getExp()){
item = curr1.getData();
list3.addAt(i, item);
curr1 = curr1.getNext();
i++;
}
else if(curr1.getData().getExp() < curr2.getData().getExp()){
item = curr2.getData();
list3.addAt(i, item);
curr2 = curr2.getNext();
i++;
}
else{
item = new Item(curr1.getData().getCoef() + curr2.getData().getCoef(), curr1.getData().getExp());
if(item.getCoef() != 0){
list3.addAt(i, item);
i++;
}
curr1 = curr1.getNext();
curr2 = curr2.getNext();
}
}
while(curr1 != null){
item = curr1.getData();
list3.addAt(i++, item);
curr1 = curr1.getNext();
}
while(curr2 != null){
item = curr2.getData();
list3.addAt(i++, item);
curr2 = curr2.getNext();
}

return list3;
}
}

/**
* 一元多项式的一般项类
*/
class Item{
private double coef; //一元多项式的一般项的系数
private int exp; //一元多项式的一般项的指数

public Item(){
this.coef = 0.0;
this.exp = 0;
}

public Item(double coef, int exp){
this.coef = coef;
this.exp = exp;
}

public double getCoef(){
return this.coef;
}

public void setCoef(double coef){
this.coef = coef;
}

public int getExp(){
return this.exp;
}

public void setExp(int exp){
this.exp = exp;
}
}

/**
* 链表结点类
*/
class Node{
private Item data;
private Node next; //链表结点的指针域,指向直接后继结点

public Node(){
data = null;
next = null;
}

public Node(Item data, Node next){
this.data = data;
this.next = next;
}

public Item getData(){
return this.data;
}

public void setData(Item data){
this.data = data;
}

public Node getNext(){
return this.next;
}

public void setNext(Node next){
this.next = next;
}
}

/**
* 链表类
*/
class LinkList{
private Node head = null; //头结点指针
private int size = 0;

public LinkList(){
head = new Node();
size = 0;
}

//在i位置插入元素elem
public boolean addAt(int i, Item elem) {
if(i < 0 || i > size){
return false;
}

Node pre,curr;
int pos;
for(pre=head; i>0 && pre.getNext()!=null; i--,pre=pre.getNext());
curr = new Node(elem, pre.getNext());
pre.setNext(curr);
size++;
return true;
}

//删除i位置的元素
public boolean removeAt(int i) {
if(i < 0 || i >= size){
return false;
}

Node pre,curr;
for(pre=head; i>0 && pre.getNext()!=null; i--,pre=pre.getNext());
curr = pre.getNext();
pre.setNext(curr.getNext());
size--;
return true;
}

//根据值value查询结点是否存在,若存在返回位置,否则返回-1
public int findByValue(Item value){
Node curr;
int pos;
for(pos=0,curr=head.getNext(); curr!=null; pos++,curr=curr.getNext()){
if(curr.getData().toString().equals(value.toString())){
break;
}
}

if(curr==null){
return -1;
}
return pos;
}

public Node getHead(){
return this.head;
}

public void setHead(Node head){
this.head = head;
}

public int getSize(){
return this.size;
}

public boolean isEmpty(){
return (size==0);
}

public void listAll(){
for(Node curr=head.getNext(); curr!=null; curr=curr.getNext()){
System.out.print("(" + curr.getData().getCoef() + ", " + curr.getData().getExp() + ")\t");
}
System.out.println();
}
}

⑶ 求java 单链表基本操作的实现

/*
注意:链表的结点数量用size表示,结点的位置为0~size-1
*/
import java.util.Scanner;

public class Test7 {
public static void main(String[] args) {
try{
LinkList list = new LinkList();
Integer value;
int pos = 0;
Scanner input = new Scanner(System.in);
String choice = null;

//测试A
while(true){
System.out.print("请输入待插入结点的值(x或X退出):");
choice = input.next();
if(choice.toUpperCase().equals("X")){
break;
}
value = Integer.valueOf(choice);
if(list.addAt(pos, value) == true){
System.out.println("插入值为 " + value + " 的结点到当前链表成功!");
pos++;
}
else{
System.out.println("插入结点失败!");
}
}

System.out.print("当前链表所有结点:");
list.listAll();

//测试B
while(true){
System.out.print("请输入待查询结点的值(x或X退出):");
choice = input.next();
if(choice.toUpperCase().equals("X")){
break;
}
value = Integer.valueOf(choice);
pos = list.findByValue(value);
if(pos == -1){
System.out.println("当前链表中不存在值为 " + value + " 的结点");
}
else{
System.out.println("值为 " + value + " 的结点在当前链表中的位置为 " + pos);
}
}

//测试C
while(true){
System.out.print("请输入待删除结点的位置[0~" + (list.getSize()-1) + "](x或X退出):");
choice = input.next();
if(choice.toUpperCase().equals("X")){
break;
}
pos = Integer.valueOf(choice);
if(list.removeAt(pos) == true){
System.out.println("删除当前链表中 " + pos + " 位置的结点成功!");
}
else{
System.out.println("删除结点失败!");
}
}

System.out.print("当前链表所有结点:");
list.listAll();
}
catch(Exception e){
e.printStackTrace();
}
}
}

/**
* 链表结点类
*/
class Node{
private Object data; //链表结点的数据域
private Node next; //链表结点的指针域,指向直接后继结点

public Node(){
data = null;
next = null;
}

public Node(Object data, Node next){
this.data = data;
this.next = next;
}

public Object getData(){
return this.data;
}

public void setData(Object data){
this.data = data;
}

public Node getNext(){
return this.next;
}

public void setNext(Node next){
this.next = next;
}
}

/**
* 链表类
*/
class LinkList{
private Node head = null; //头结点指针
private int size = 0;

public LinkList(){
head = new Node();
size = 0;
}

//在i位置插入元素elem
public boolean addAt(int i, Object elem) {
if(i < 0 || i > size){
return false;
}

Node pre,curr;
int pos;
for(pre=head; i>0 && pre.getNext()!=null; i--,pre=pre.getNext());
curr = new Node(elem, pre.getNext());
pre.setNext(curr);
size++;
return true;
}

//删除i位置的元素
public boolean removeAt(int i) {
if(i < 0 || i >= size){
return false;
}

Node pre,curr;
for(pre=head; i>0 && pre.getNext()!=null; i--,pre=pre.getNext());
curr = pre.getNext();
pre.setNext(curr.getNext());
size--;
return true;
}

//根据值value查询结点是否存在,若存在返回位置,否则返回-1
public int findByValue(Object value){
Node curr;
int pos;
for(pos=0,curr=head.getNext(); curr!=null; pos++,curr=curr.getNext()){
if(curr.getData().toString().equals(value.toString())){
break;
}
}

if(curr==null){
return -1;
}
return pos;
//return (curr!=null ? pos : -1);
}

public int getSize(){
return size;
}

public boolean isEmpty(){
return (size==0);
}

public void listAll(){
for(Node curr=head.getNext(); curr!=null; curr=curr.getNext()){
System.out.print(curr.getData() + "\t");
}
System.out.println();
}
}

⑷ java如何实现链表

链表是一种重要的数据结构,在程序设计中占有很重要的地位。C语言和C++语言中是用指针来实现链表结构的,由于Java语言不提供指针,所以有人认为在Java语言中不能实现链表,其实不然,Java语言比C和C++更容易实现链表结构。Java语言中的对象引用实际上是一个指针(本文中的指针均为概念上的意义,而非语言提供的数据类型),所以我们可以编写这样的类来实现链表中的结点。
class Node
{
Object data;
Node next;//指向下一个结点
}
将数据域定义成Object类是因为Object类是广义超类,任何类对象都可以给其赋值,增加了代码的通用性。为了使链表可以被访问还需要定义一个表头,表头必须包含指向第一个结点的指针和指向当前结点的指针。为了便于在链表尾部增加结点,还可以增加一指向链表尾部的指针,另外还可以用一个域来表示链表的大小,当调用者想得到链表的大小时,不必遍历整个链表。下图是这种链表的示意图:
链表的数据结构
我们可以用类List来实现链表结构,用变量Head、Tail、Length、Pointer来实现表头。存储当前结点的指针时有一定的技巧,Pointer并非存储指向当前结点的指针,而是存储指向它的前趋结点的指针,当其值为null时表示当前结点是第一个结点。那么为什么要这样做呢?这是因为当删除当前结点后仍需保证剩下的结点构成链表,如果Pointer指向当前结点,则会给操作带来很大困难。那么如何得到当前结点呢,我们定义了一个方法cursor(),返回值是指向当前结点的指针。类List还定义了一些方法来实现对链表的基本操作,通过运用这些基本操作我们可以对链表进行各种操作。例如reset()方法使第一个结点成为当前结点。insert(Object d)方法在当前结点前插入一个结点,并使其成为当前结点。remove()方法删除当前结点同时返回其内容,并使其后继结点成为当前结点,如果删除的是最后一个结点,则第一个结点变为当前结点。
链表类List的源代码如下:
import java.io.*;
public class List
{
/*用变量来实现表头*/
private Node Head=null;
private Node Tail=null;
private Node Pointer=null;
private int Length=0;
public void deleteAll()
/*清空整个链表*/
{
Head=null;
Tail=null;
Pointer=null;
Length=0;
}
public void reset()
/*链表复位,使第一个结点成为当前结点*/
{
Pointer=null;
}
public boolean isEmpty()
/*判断链表是否为空*/
{
return(Length==0);
}
public boolean isEnd()
/*判断当前结点是否为最后一个结点*/
{
if(Length==0)
throw new java.lang.NullPointerException();
else if(Length==1)
return true;
else
return(cursor()==Tail);
}
public Object nextNode()
/*返回当前结点的下一个结点的值,并使其成为当前结点*/
{
if(Length==1)
throw new java.util.NoSuchElementException();
else if(Length==0)
throw new java.lang.NullPointerException();
else
{
Node temp=cursor();
Pointer=temp;
if(temp!=Tail)
return(temp.next.data);
else
throw new java.util.NoSuchElementException();
}
}
public Object currentNode()
/*返回当前结点的值*/
{
Node temp=cursor();
return temp.data;
}

public void insert(Object d)
/*在当前结点前插入一个结点,并使其成为当前结点*/
{
Node e=new Node(d);
if(Length==0)
{
Tail=e;
Head=e;
}
else
{
Node temp=cursor();
e.next=temp;
if(Pointer==null)
Head=e;
else
Pointer.next=e;
}
Length++;
}
public int size()
/*返回链表的大小*/
{
return (Length);
}
public Object remove()
/*将当前结点移出链表,下一个结点成为当前结点,如果移出的结点是最后一个结点,则第一个结点成为当前结点*/
{
Object temp;
if(Length==0)
throw new java.util.NoSuchElementException();
else if(Length==1)
{
temp=Head.data;
deleteAll();
}
else
{
Node cur=cursor();
temp=cur.data;
if(cur==Head)
Head=cur.next;
else if(cur==Tail)
{
Pointer.next=null;
Tail=Pointer;
reset();
}
else
Pointer.next=cur.next;
Length--;
}
return temp;
}
private Node cursor()
/*返回当前结点的指针*/
{
if(Head==null)
throw new java.lang.NullPointerException();
else if(Pointer==null)
return Head;
else
return Pointer.next;
}
public static void main(String[] args)
/*链表的简单应用举例*/
{
List a=new List ();
for(int i=1;i<=10;i++)
a.insert(new Integer(i));
System.out.println(a.currentNode());
while(!a.isEnd())
System.out.println(a.nextNode());
a.reset();
while(!a.isEnd())
{
a.remove();
}
a.remove();
a.reset();
if(a.isEmpty())
System.out.println("There is no Node in List \n");
System.in.println("You can press return to quit\n");
try
{
System.in.read();
//确保用户看清程序运行结果
}
catch(IOException e)
{}
}
}
class Node
/*构成链表的结点定义*/
{
Object data;
Node next;
Node(Object d)
{
data=d;
next=null;
}
}
读者还可以根据实际需要定义新的方法来对链表进行操作。双向链表可以用类似的方法实现只是结点的类增加了一个指向前趋结点的指针。
可以用这样的代码来实现:
class Node
{
Object data;
Node next;
Node previous;
Node(Object d)
{
data=d;
next=null;
previous=null;
}
}
当然,双向链表基本操作的实现略有不同。链表和双向链表的实现方法,也可以用在堆栈和队列的实现中,这里就不再多写了,有兴趣的读者可以将List类的代码稍加改动即可。

希望对你有帮助。

⑸ 用java单链表实现一元多项式相加的算法

public class Test {

public static void main(String[] args) {
try{
LinkList list1 = new LinkList();
LinkList list2 = new LinkList();
LinkList list3 = null;

list1.addAt(0, new Item(1, 5));
list1.addAt(1, new Item(-1.5, 3));
list1.addAt(2, new Item(1, 1));

list2.addAt(0, new Item(0.5, 5));
list2.addAt(1, new Item(0.5, 4));
list2.addAt(2, new Item(1.5, 3));
list2.addAt(3, new Item(3, 0));

list3 = mergeLinkList(list1, list2);

System.out.println("一元多项式的相加过程:");
list1.listAll();
System.out.println(" + ");
list2.listAll();
System.out.println(" = ");
list3.listAll();
}
catch(Exception e){
e.printStackTrace();
}
}

/**
* 一元多项式的一般项类
*/
class Item{
private double coef; //一元多项式的一般项的系数
private int exp; //一元多项式的一般项的指数

public Item(){
this.coef = 0.0;
this.exp = 0;
}

public Item(double coef, int exp){
this.coef = coef;
this.exp = exp;
}

public double getCoef(){
return this.coef;
}

public void setCoef(double coef){
this.coef = coef;
}

public int getExp(){
return this.exp;
}

public void setExp(int exp){
this.exp = exp;
}
}

/**
* 链表结点类
*/
class Node{
private Item data;
private Node next; //链表结点的指针域,指向直接后继结点

public Node(){
data = null;
next = null;
}

public Node(Item data, Node next){
this.data = data;
this.next = next;
}

public Item getData(){
return this.data;
}

public void setData(Item data){
this.data = data;
}

public Node getNext(){
return this.next;
}

public void setNext(Node next){
this.next = next;
}
}

/**
* 链表类
*/
class LinkList{
private Node head = null; //头结点指针
private int size = 0;

public LinkList(){
head = new Node();
size = 0;
}

//在i位置插入元素elem
public boolean addAt(int i, Item elem) {
if(i < 0 || i > size){
return false;
}

Node pre,curr;
int pos;
for(pre=head; i>0 && pre.getNext()!=null; i--,pre=pre.getNext());
curr = new Node(elem, pre.getNext());
pre.setNext(curr);
size++;
return true;
}

//删除i位置的元素
public boolean removeAt(int i) {
if(i < 0 || i >= size){
return false;
}

Node pre,curr;
for(pre=head; i>0 && pre.getNext()!=null; i--,pre=pre.getNext());
curr = pre.getNext();
pre.setNext(curr.getNext());
size--;
return true;
}

java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。

⑹ 求单链表的长度的递归算法(java)

package cn.uestc.fz;

class Node{
int data;
Node next;
public Node(int data,Node next){
this.data=data;
this.next=next;
}
}
public class LinkedList {
Node head;
public void add(Node node){
if(head==null)
head=node;
else{
Node p=head;
while(p.next!=null)
p=p.next;
p.next=node;
}
}

public int length(){
return this.length(head);
}

public int length(Node node){
if(node==null)
return 0;
else if(node.next==null)
return 1;
else
return 1+this.length(node.next);
}

public void printList(){
Node p=head;
while(p!=null){
System.out.print(p.data+"->");
p=p.next;
}
System.out.println();
}

public static void main(String args[]){
LinkedList list = new LinkedList();
list.add(new Node(1,null));
list.add(new Node(2,null));
list.add(new Node(3,null));
list.add(new Node(4,null));
list.add(new Node(5,null));
list.add(new Node(6,null));
list.printList();
System.out.println(list.length());
}
}

刚写的。

⑺ java数据结构单链表

你的问题很好理解。但是你的代码问题严重。
1、你想用java代码实现还是c代码实现?从你的代码看是c语言
2、第一段代码中的结构体nod是不是应该写成Node?
3、inset函数中,链表L是有变化的,所以要用指针。结点s是不改变的,所以不应该用指针
4、既然s不是用指针,后面的s->next自然也不能这么写了。

⑻ 急急急 如何用Java语言实现判断一个链表是否存在循环连接的算法

编写两个java类,一个为Linkitem.java,另一个为测试类LinklistTest.java,分别如下:

*****************************************************
//Linkitem.java

public class Linkitem {
Linkitem previous;
String data;
Linkitem next;

public Linkitem() {

}

public Linkitem(Linkitem previous, String data, Linkitem next) {
super();
this.previous = previous;
this.data = data;
this.next = next;
}

public Linkitem getPrevious() {
return previous;
}

public void setPrevious(Linkitem previous) {
this.previous = previous;
}

public String getData() {
return data;
}

public void setData(String data) {
this.data = data;
}

public Linkitem getNext() {
return next;
}

public void setNext(Linkitem next) {
this.next = next;
}

}

*****************************************************

//LinklistTest.java

import java.util.ArrayList;

public class LinklistTest {
public static void main(String[] args) {
//初始化链表项
Linkitem a = new Linkitem(null, "a", null);
Linkitem b = new Linkitem(null, "b", null);
Linkitem c = new Linkitem(null, "c", null);
Linkitem d = new Linkitem(null, "d", null);
a.setPrevious(d);
a.setNext(b);
b.setPrevious(a);
b.setNext(c);
c.setPrevious(b);
c.setNext(d);
d.setPrevious(c);
d.setNext(a);
//新建存放链表的数组列表
ArrayList<Linkitem> list = new ArrayList<Linkitem>();
//添加个链表项
list.add(a);
list.add(b);
list.add(c);
list.add(d);
//是否为循环链表的判断变量
boolean link = false;
Linkitem start = a;
Linkitem current = a;
//判断循环链表
for (int i = 0; i < list.size(); i++) {
current = current.next;
if (start.data.equals(current.data)) {
link = true;
}
}
//输出
if (link == true) {
System.out.println("此链表为循环链表。");
} else {
System.out.println("此链表不是循环链表。");
}
}
}

*****************************************************
运行结果为:

此链表为循环链表。

⑼ JAVA 语言!定义单链表,完成下了算法: 1、从键盘上依次输入21、18、30、75、42、56,逆序创建单链表

我想java.util.LinkedList的源码可以帮助你解决大部分问题,包括你想要的这5个功能实现。

⑽ 使用java设计算法,完成将两个有序递增的单链表合并为一个有序递增的单链表,重复的元素只出现一次。

type
point=^node;
node=record
data:integer;
next:point;
end;
var h1,h2,h:point;
procere prt(p:point); //打印链表
begin
p:=p^.next;
while p<>nil do
begin
write(p^.data,' ');
p:=p^.next;
end;
writeln;
end;
procere creat(var h:point); //建立链表
var x:integer; p,q:^node;
begin
writeln('请输入升序的数,负数结束:');
new(h);
p:=h;
read(x);
while(x>=0)do
begin
new(q);
q^.data:=x;
p^.next:=q;
p:=q;
read(x);
end;
p^.next:=nil;
end;

function merge_link(var p,q:point):point; //升序合并二个升序链表
var h,w:^node;
begin
w:=p; p:=p^.next; dispose(w); //回收一个头结点,p指向首个数据结点
w:=q; h:=q; q:=q^.next; //h:合并后的头结点,q指向首个数据结点
while (p<>nil)and(q<>nil) do //当二个链表都不空时
if(p^.data<q^.data) then //选一个小的结点
begin
w^.next:=p; //把小结点链入
p:=p^.next; //跳过此结点
w:=w^.next; //w指向当前合并后链表的尾结点
end
else
begin //下面三行作用同上
w^.next:=q;
q:=q^.next;
w:=w^.next;
end;
if p<>nil then w^.next:=p; //将未完的链表接入
if q<>nil then w^.next:=q; //将未完的链表接入
merge_link:=h; //返回合并后的链表头指针
end;
begin
creat(h1);
creat(h2);
h:=merge_link(h1,h2);
writeln('合并后的链表:');
prt(h);

阅读全文

与java链表算法相关的资料

热点内容
做什么app赚钱 浏览:83
博途编译失败联系客户支持部门 浏览:926
金蝶旗舰版编译 浏览:50
万象服务器断电后启动不了怎么办 浏览:356
我的世界苹果版的2b2t服务器地址咋查 浏览:95
xlsx转换pdf 浏览:98
3dmax挤出命令英语 浏览:903
靶心率的定义和算法 浏览:514
3d模术师app哪里下载 浏览:474
php中文api文档 浏览:458
安卓设计怎么加入输入框 浏览:185
主根服务器什么时候开始 浏览:738
奇门遁甲完整版pdf 浏览:904
app软件怎么用的 浏览:802
电子书pdf购买 浏览:194
浪潮服务器如何做系统 浏览:112
冒险岛img格式加密 浏览:598
我的世界手游如何复制命令 浏览:660
天刀自动弹琴脚本源码 浏览:971
打开其它app微信怎么收不到 浏览:447