对于链表有很多其他的操作,如对链表中的数据进行排序,对单向链表的结点逆置,判断一个链表是否是循环链表等等。
首先我们先解决对链表中的数据进行排序的问题,链表中只有一个数据还好办,直接交换元素即可,可是链表中的数据域不一定只有一个元素,而且数据类型如果是Object类也有点复杂,要首先转换成String类型,然后强制转换成int类型才能进行比较。
/**
* 链表的排序方法
*/
public void sort(){
Node node=head;
while(node !=null){
Node node1=node.next;
while(node1!=null){
if(node.a<node1.a){
int temp=node.a;
node.a=node1.a;
node1.a=temp;
}
node1=node1.next;
}
node=node.next;
}
}
接下来是链表的逆置问题
/**
* 链表的逆置
*/
public void inverse(){
Node node=head;
Node node1=last.next;
Node node2=node.next;
while(node2!=null){
node.next=node1;
node1=node;
node=node2;
node2=node2.next;
}
node.next=node1;
}
其中head是头结点,last是尾结点。
判断链表中是否有环,可以设置两个指针,fast和slow,链表遍历中,fast一次走两步,即fast=fast.next.next,而slow走一步,即slow=slow.next,如果链表中有环,必定slow 和fast会相遇
具体方法如下:
/**
* 判断一个链表是否有环
*
*/
public boolean isLoop(){
Node fast=head;
Node slow=head;
while(fast!=null&&fast.next!=null){
slow=slow.next;
fast=fast.next.next;
if(slow==fast)
return false;
}
return true;
}