* 链表末尾插入数据
	 * @param d
	 */
	public void addNode(int d){
		ListNode n=new ListNode(d);
		if(this.head==null){
			this.head=n;
		}
		else{
			ListNode tmp=this.head;
			while(tmp.next!=null){
				tmp=tmp.next;
			}
			tmp.next=n;
		}
	}
	
	public void addNode(ListNode n){
		if(this.head==null)this.head=n;
		else{
			ListNode tmp=this.head;
			while(tmp.next!=null){
				tmp=tmp.next;
			}
			tmp.next=n;
		}		
	}
	
	
	 * 删除第index个节点
	 */
	public boolean deleteNode(int index){
		int i=1;
		if(index<1||index>length())return false;
		if(index==1){
			this.head=this.head.next;
			return true;
		}		
		ListNode preNode=this.head;
		ListNode curNode=preNode.next;
		while(curNode!=null){
			if(i==index-1){
				preNode.next=curNode.next;
				return true;
			}
			preNode=curNode;
			curNode=curNode.next;
			i++;
		}
		return false;
	}
	
	
	 * 返回节点长度
	 */
	public int length(){
		int length=0;
		ListNode tmp=this.head;
		while(tmp!=null){
			length++;
			tmp=tmp.next;
		}
		return length;		
	}
	
	
	 * 在不知道头指针的情况下删除指定节点
	 */
	public boolean deleteNode1(ListNode n){
		if(n==null||n.next==null)return false;
		n.data=n.next.data;
		n.next=n.next.next;
		return true;
	}
	
	
	 * 打印节点
	 */
	public void printList(){
		ListNode tmp=this.head;
		while(tmp!=null){
			System.out.print(tmp.data+" ");
			tmp=tmp.next;
		}
		System.out.println();
	}
	
	
	 * 链表反转
	 */
	public Link ReverseIteratively(){
		ListNode pNode=this.head;
		ListNode pPrev=null;
		Link newLink = null;
		while(pNode!=null){
			ListNode pNext=pNode.next;
			if(pNext==null){
				newLink=new Link(pNode);
			}
			pNode.next=pPrev;
			pPrev=pNode;
			pNode=pNext;
		}
		return newLink;
	}
	
	
	 * 查找单链表的中间结点
	 * 采用快慢指针的方式查找单链表的中间节点,快指针一次走两步,慢指针一次走一步,当快指针走完时,慢指针刚好到达中间节点。
	 */
	public ListNode SearchMid(){
		ListNode fast=this.head;
		ListNode low=this.head;
		while(fast!=null&&fast.next!=null&&fast.next.next!=null){
			fast=fast.next.next;
			low=low.next;
		}
		System.out.println(low.data);
		return low;		
	}
	
	
	 * 查找倒数第k个节点
	 * 采用两个指针P1,P2,P1先前移K步,然后P1、P2同时移动,当p1移动到尾部时,P2所指位置的元素即倒数第k个元素 。
	 */
	public ListNode findElem(ListNode head, int k){
		if(k<1||k>this.length())return null;
		int index=0;
		ListNode p=head;
		ListNode q=head;
		for(int i=0;i<k;i++){
			q=q.next;
		}
		while(q!=null){
			p=p.next;
			q=q.next;
		}
		System.out.println(p.data);
		return p;		
	}
	
	
	 * 对列表进行排序
	 */
	public void SortList(){
		ListNode curNode=this.head;
		ListNode nextNode=null;
		int tmp=0;
		while(curNode.next!=null){
			nextNode=curNode.next;
			while(nextNode!=null){
				if(curNode.data>nextNode.data){
					tmp=curNode.data;
					curNode.data=nextNode.data;
					nextNode.data=tmp;
				}
				nextNode=nextNode.next;
			}
			curNode=curNode.next;
		}
	}
	
	
	 * 删除重复节点
	 */
	public void deleteDuplecate(){
		ListNode curNode=this.head;
		ListNode nextNode=null;
		while(curNode.next!=null){
			nextNode=curNode;
			while(nextNode.next!=null){
				if(curNode.data==nextNode.next.data){
					nextNode.next=nextNode.next.next;
				}else
					nextNode=nextNode.next;
			}
			curNode=curNode.next;
		}
	}
	
	
	 * 从尾到头输出单链表,采用递归方式
	 */
	public void printListReversely(ListNode node){
		if(node.next!=null){
			printListReversely(node.next);
		}
		System.out.println(node.data);
	}