java链表算法_Java实现链表的常见操作算法

packagecom.linkedlist;importjava.util.Hashtable;public classLinkedListOperator {private Node head = null;//头结点//在链表的末尾增加一个结点

private void addNode(intdata) {

Node newNode= newNode(data);if (head == null) {

head=newNode;return;

}

Node temp=head;while (temp.getNext() != null) {

temp=temp.getNext();

}

temp.setNext(newNode);

}//打印链表结点

private voidprintLink() {

Node curNode=head;while (curNode != null) {

System.out.println(curNode.getData());

curNode=curNode.getNext();

}

System.out.println("===========");

}//求链表长度

private intgetLength() {int len = 0;

Node curNode=head;while (curNode != null) {

len++;

curNode=curNode.getNext();

}returnlen;

}//删除某一个结点

private boolean delNode(intindex) {if (index < 1) {return false;

}if (index == 1) {

head=head.getNext();return true;

}

Node preNode=head;

Node curNode=head.getNext();int n = 1;while (curNode.getNext() != null) {if (n ==index) {

preNode.setData(curNode.getData());

preNode.setNext(curNode.getNext());return true;

}

preNode=preNode.getNext();

curNode=curNode.getNext();

n++;

}if (curNode.getNext() == null) {

preNode.setNext(null);

}return false;

}//链表排序:选择排序法,从小到大

private voidsortList() {

Node curNode=head;while (curNode != null) {

Node nextNode=curNode.getNext();while (nextNode != null) {if (curNode.getData() >nextNode.getData()) {int temp =curNode.getData();

curNode.setData(nextNode.getData());

nextNode.setData(temp);

}

nextNode=nextNode.getNext();

}

curNode=curNode.getNext();

}

}//去掉重复元素

private voiddistinctLink() {

Hashtable map = new Hashtable();

Node curNode=head;

Node preNode= null;while (curNode != null) {if(map.containsKey(curNode.getData())) {

preNode.setData(curNode.getData());

preNode.setNext(curNode.getNext());

}else{

map.put(curNode.getData(),1);

preNode=curNode;

}

curNode=curNode.getNext();

}

}//返回倒数第k个结点,定义两个指针,第一个指针向前移动K-1次,之后两个指针同时前进,//当第一个指针到达末尾时,第二个指针所在的位置即为倒数第k个结点

private Node getReverNode(intk) {if (k < 1) {return null;

}

Node first=head;

Node second=head;for (int i = 0; i < k - 1; i++) {

first=first.getNext();

}while (first.getNext() != null) {

first=first.getNext();

second=second.getNext();

}returnsecond;

}//反转链表

private voidreserveLink() {

Node preNode= null;

Node curNode=head;

Node tempNode= null;while (curNode != null) {

tempNode=curNode.getNext();

curNode.setNext(preNode);

preNode=curNode;

curNode=tempNode;

}

head=preNode;

}//寻找链表的中间结点

privateNode getMiddleNode() {

Node slowNode=head;

Node quickNode=head;while (slowNode.getNext() != null && quickNode.getNext() != null) {

slowNode=slowNode.getNext();

quickNode=quickNode.getNext().getNext();

}returnslowNode;

}//判断链表是否有环

private booleanisRinged() {if (head == null) {return false;

}

Node slowNode=head;

Node quickNode=head;while (slowNode.getNext() != null && quickNode.getNext() != null) {

slowNode=slowNode.getNext();

quickNode=quickNode.getNext().getNext();if (slowNode.getData() ==quickNode.getData()) {return true;

}

}return false;

}//删除指定结点

private booleandelNode(Node node) {if (node.getNext() == null) {return false;//在不知道头结点的情况下,没法删除单链表的尾结点

}

node.setData(node.getNext().getData());

node.setNext(node.getNext().getNext());return true;

}//判断两个链表是否相交:相交的链表的尾结点相同

private booleanisCross(Node n1, Node n2) {while (n1.getNext() != null) {

n1=n1.getNext();

}while (n2.getNext() != null) {

n2=n2.getNext();

}if (n1.getData() ==n2.getData()) {return true;

}return false;

}//求相交链表的起始点

privateNode getFirstCrossNode(LinkedListOperator l1, LinkedListOperator l2) {int len = l1.getLength() -l2.getLength();

Node n1=l1.head;

Node n2=l2.head;if (len > 0) {for (int i = 0; i < len; i++) {

n1=n1.getNext();

}

}else{for (int i = 0; i < len; i++) {

n2=n2.getNext();

}

}while (n1.getData() !=n2.getData()) {

n1=n1.getNext();

n2=n2.getNext();

}returnn1;

}public static voidmain(String[] args) {

LinkedListOperator llo= newLinkedListOperator();

llo.addNode(10);

llo.addNode(4);

llo.addNode(6);

llo.addNode(8);

llo.printLink();//llo.delNode(4);//llo.sortList();//llo.distinctLink();//System.out.println(llo.getReverNode(3).getData());//llo.reserveLink();//System.out.println(llo.getMiddleNode().getData());//System.out.println(llo.isRinged());

llo.delNode(llo.head.getNext().getNext());

llo.printLink();

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值