链表:
1. 插入节点
2.删除第n个节点
3.链表的长度
4.判断是否有环
5.链表反转
6.查找链表倒数第k个节点
7.查询单链表的中间节点
8.输出链表
节点类:
public class LNode {
int data;
LNode next;
public LNode(int n){
this.data=n;
this.next=null;
}
public LNode(){
}
}
链表操作:
public class MyLinkedList {
LNode head=null;
/**
* 向链表中插入数据
*/
public void insert(int n){
LNode node=new LNode(n);
if(head==null){
head=node;
return;
}
LNode temp=head;
while(temp.next!=null){
temp=temp.next;
}
temp.next=node;
}
/**
* 链表的长度
*/
public int length(){
LNode temp=head;
int i=1;
while(temp.next!=null){
i++;
temp=temp.next;
}
return i;
}
/**
* 删除第n的节点
*/
public void delete(int n){
if(n<1 || n >length()){
return;
}
int i=0;
LNode p=head;
while(i<n-2 && p.next!=null ){
i++;
p=p.next;
}
p.next=p.next.next;
}
/**
* 判断链表是否有环
* 快慢指针 快指针追的上慢指针
*/
public Boolean hasCycle(){
Boolean flag=false;
LNode p1=head;
LNode p2=head;
while(p1!=null && p2!=null){
p1=p1.next;
p2=p2.next.next;
if(p2==p1){
flag=true;
break;
}
}
return flag;
}
/**
* 链表反转
*/
public void resverse(){
if(head==null && head.next==null){
return;
}
LNode pre=null;
LNode temp=null;
while(head!=null){
temp=head.next;
head.next=pre;
pre=head;
head=temp;
}
this.head=pre;
}
/**
* 查找链表倒数第k个节点
* 双指针法
*/
public LNode reKNode(int k){
if(head==null) return null;
int length=length();
if(length<k){
return null;
}
LNode p=head;
LNode q=head;
//先移动到第k个节点
for(int i=0;i<k;i++){
p=p.next;
}
//两个指针通知移动 当p走到结尾时 q则为倒数第k个节点
while(p!=null){
p=p.next;
q=q.next;
}
return q;
}
/**
* 查询单链表的中间节点
* 定义连个节点 一个走一步 一个走两步
* 当走两步的为null时 走一步的则为中间节点
*/
public LNode searchMiddleNode(){
LNode p1=head;
LNode p2=head;
while(p2!=null && p2.next!=null && p2.next.next!=null){
p1=p1.next;
p2=p2.next.next;
}
return p1;
}
/**
* 输出链表
*/
public void consoleLinkedList(){
LNode temp=head;
while(temp!=null){
System.out.println(temp.data);
temp=temp.next;
}
}
}