Java链表

2023-05-16

package myTest;
public class Node{
	int data=-1;
	Node next;	
	Node(int data){
		this.data=data;
		
	}
	Node(){
		
	}
	public static Node BuildmyLinkarr(int []arr,boolean HasHeadNode){
		if (arr.length<=0){return null;}
		if(HasHeadNode){
			Node Head =new Node();//头结点
			Node p=Head;//pre存储第一个有效结点的地址
			for(int i=0;i<arr.length;i++){
				p.next=new Node(arr[i]);//建立新节点,并将该节点的地址存储到上一个结点的next中
				p=p.next;//将上一个结点的指针向后移动一个结点
			}
			p.next=null;
			return Head;
		}
		else {
			Node Head=new Node(arr[0]);//p存储第一个有效结点的地址
			Node p=Head;
			for(int i=1;i<arr.length;i++){
				p.next=new Node(arr[i]);//建立新节点,并将该节点的地址存储到上一个结点的next中
				p=p.next;//将上一个结点的指针向后移动一个结点
				
			}
			p.next=null;
			return Head;
			
		}
	}
	public static void PrintLinkarr(Node Head,boolean HasHeadNode){
		if(HasHeadNode){
		Node p=Head.next;
		System.out.println("Now it is printing:");
		while(p!=null){
			System.out.println(p.data);
			p=p.next;
		}
		}
		else {
		Node p=Head;
		System.out.println("Now it is printing:");
		while(p!=null){
			System.out.println(p.data);
			p=p.next;
		}
			
		}
	}
	public static Node Reverse(Node Head,boolean HasHeadNode){
		if(HasHeadNode){
			Node p1=Head.next;
			Node p2=p1.next;
			while(p2!=null){
				Node p3=p2.next;
				p2.next=p1;
				p1=p2;
				p2=p3;
			}
			Head.next.next=null;
			Head.next=p1;
			return Head;
		}
		else {
			Node p1=Head;
			Node p2=p1.next;
			while(p2!=null){
				Node p3=p2.next;
				p2.next=p1;
				p1=p2;
				p2=p3;
			}
			Head.next=null;
			Head=p1;
			return Head;
			
		}
	}
	public static void main(String []args){
		int[]arr=new int[]{4,3,5,6,2};
		System.out.println("Have HeadNode:(有头结点)");
		Node myHead=BuildmyLinkarr(arr,true);
		PrintLinkarr(myHead,true);
		myHead=Reverse(myHead,true);
		PrintLinkarr(myHead,true);
		System.out.println("No HeadNode:(没有头结点)");
		Node myHead2=BuildmyLinkarr(arr,false);
		PrintLinkarr(myHead2,false);
		myHead2=Reverse(myHead2,false);
		PrintLinkarr(myHead2,false);
		
	}
}

这部分代码已经测过,可以直接运行,保存在Node.java中。

具体来说,我用java实现了几个功能:建立链表,翻转链表和输出链表。这里的链表分为两种(带头结点的单链表和不带头节点的单链表)

注意:需要注意的是,带头结点的单链表还是有好处的,不用担心头指针改变。(函数返不返回头指针都可以,因为头指针Head不改变)

而不带头结点的链表在执行完Reverse(Head,false)这个函数之后头指针指向的地址会发生改变,因此该操作一定要返回头指针。

此外,单链表的翻转我也终于弄懂了:

对于含有头结点的链表和不含头结点的链表,要做的是先画图,画了流程之后自然就不会错了:

                        Node p1=Head.next;
			Node p2=p1.next;
			while(p2!=null){
				Node p3=p2.next;
				p2.next=p1;
				p1=p2;
				p2=p3;
			}
			Head.next.next=null;
			Head.next=p1;
			return Head;
上面这部分对应的思路如下:

a.需要定义三个额外的指针(引用变量p1,p2,p2,这三个指针一开始分别指向第1,2,3个结点)

b.然后第二个结点指向第一个结点

c.p1,p2,p3分别向后滑动一位。

d.重复b操作

直到p2指向null,停止循环

e.将第1个结点指向null

d.将头结点指向原来的尾结点(结点4)





本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java链表 的相关文章

随机推荐