Bootstrap

链表(java实现)

补充:对象

类是什么?

创建jav程序必须要先创建一个类class

Student n1 = new Student()

new本身是java的一个关键字,要求在堆里开辟内存空间

Student()构造器,创建对象的时候给对象的数据赋初始值。默认任何一个类当中都有一个不显示的构造器,一旦显示的创造出构造,那么不显示的那个构造器就会被覆盖

s1对象的名称。

Student (数据类型)对象的类型决定对象在内存当中的存储形式

int 1bit符号位,31bit符号位。byte 1bit符号位,7bit符号位。float 1bit符号位,8bit阶位,23bit数值位。double 1bit符号位,11bit阶位,52bit数值位。

对象是堆里面的一块内存空间

给定一个单链表,不知道大小,要求只遍历一遍,找到单链表的中间节点

快慢指针思想

//遍历一遍找到中间节点
	public Node findMid() {
		Node fast = head;
		Node slow = head;
		while((fast != null)&&(fast.next != null)) {
			fast = fast.next.next;
			slow = slow.next;
		}
		return slow;
	}

尾插法添加元素

//尾插法
	public void EndInsert(int val) {
		//创建新节点
		Node newNode = new Node(val);
		//判断头指针指向为空,那么头指针指向第一个节点
		if(head == null) {
			head = newNode;
			return ;//这里不可以不写
		}
		
		Node preNode = head;
		while(preNode.next != null) {
			preNode = preNode.next;
		}
		preNode.next = newNode;
		
	}

头插法添加元素

//头插法
	public void HeadInsert(int val) {
		//创建新节点
		Node newNode = new Node(val);
		//判断头指针指向为空,那么头指针指向第一个节点
		if(head == null) {
		head = newNode;
		return ;//这里不可以不写
		}
		newNode.next = head;
		head = newNode;
	}

获取链表长度

//获取链表长度
	public int GetLength() {
		int length = 0;
        Node current = head;
        while (current != null) {
            length++;
            current = current.next;
        }
        return length;
	}

输出链表

//输出链表
	public void write() {
		Node current = head;
        while (current != null) {
        	System.out.print(current.data);
        	if(current.next  != null) {
        		System.out.print(" ");
        	}else {
        		System.out.println("\n");
        	}
            current = current.next;
        }
	}

指定位置插入数据

//指定位置插入数据
	public void insertAiIndex(int value,int position) {
		if(position<0||position>GetLength()) {
			System.out.println("插入位置不合理");
			return;
		}
		if(position == 0) {
			//头插法
			HeadInsert(value);
		}else if(position==GetLength()) {
			//尾插法
			EndInsert(value);
		}else {
			int count=0;
			Node index = head;
			Node pre = null;
			while(index != null) {
				if(count==position) {
					Node node = new Node(value);
					node.next = index;
					pre.next = node;
					return;
				}
				pre = index;
				index = index.next;
				count++;
			}
		}
	}

指定位置删除数据

//指定位置删除数据
	public void deleteAtIndex(int position) {
		if(position<0||position>GetLength()-1) {
			System.out.println("删除位置不合理");
			return;
		}
		if(position == 0) {
			head = head.next;
		}else{
			int count=0;
			Node index = head;
			Node pre = null;
			while(index != null) {
				if(count==position) {
					pre.next = index.next;
					return;
				}
				pre = index;
				index = index.next;
				count++;
			}
		}
	}

检查链表是否有环

//创建环形链表
	 public void add(int data) {
	        Node newNode = new Node(data);
	        if (head == null) {
	            head = newNode;
	            head.next = head; // 初始化为环形
	        } else {
	            Node current = head;
	            while (current.next != head) { // 遍历到最后一个节点
	                current = current.next;
	            }
	            current.next = newNode;
	            newNode.next = head; // 新节点指向头节点,形成闭环
	        }
	    }
	
	//判断链表是否成环
	public boolean Circle() {
		 Node slow = head;
	     Node fast = head; 
	     while (fast != null && fast.next != null) {
	            slow = slow.next;
	            fast = fast.next.next; 
	            if (slow == fast) {
		              return true; 
		            }
	        }
	        return false;
	}
	//判断链表是否成环并返回头结点的值
	public Node HeadCircle() {
		 Node slow = head;
	     Node fast = head; 
	     while (fast != null && fast.next != null) {
	            slow = slow.next;
	            fast = fast.next.next; 
	            if (slow == fast) {
		              slow = head;
		              while(slow != fast) {
		            	  slow = slow.next;
		            	  fast = fast.next;
		              }
		              //两个再次指针相遇,即为起点
		              return slow;
		            }
	        }
	        return null;
	}

;