补充:对象
类是什么?
创建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;
}