链表

链表:

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;
		}
	}
}


发布了53 篇原创文章 · 获赞 5 · 访问量 8万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章