想想单链表都是大二那会学的了,以前觉得没什么,最近频繁的面试季节,仿佛不会这玩意儿感觉面试是寸步难行。从今天开始,还是从基础开始总结一下。今天先总结了单链表的基本操作,总觉得纸上谈兵永远得不到进步,就都用java实现了一下,方便自己理解。后续还会总结常用相关单链表的面试题。
import java.util.Scanner;
public class BasicOp {
private Node head;
public BasicOp(){
this.head = null;
}
//头插法 头插法也可以让链表反转
public void addNodePre(int val){
Node node = new Node(val);
if(head==null){
head = node;
return;
}
node.next = head;
head = node;
}
//尾插法
public void addNodeFail(int val){
Node node = new Node(val);
if(head==null){
head = node;
return;
}
Node temp = head;
while(temp.next!=null){
temp = temp.next;
}
temp.next = node;
}
//在第i个位置插入值
public void insert(int i,int val){
if(head==null){
return;
}
Node temp = head;
int j=0;
while(temp!=null){
j++;
if(i==j){
Node node = new Node(val);
node.next = temp.next;
temp.next = node;
break;
}
temp = temp.next;
}
}
//删除第i个结点 (面试常问删除,不是有多难,只是要考虑的全面,把删除头结点的单独放出来删除,中间结点和尾结点的删除是一样的)
public Boolean deleteNode(int i){
if(i<1||i>length()){
return false; //删除元素位置不合理
}
if(head==null){ //都没有结点拿什么删除
return false;
}
//删除第一个结点
if(i==1){
head = head.next;
return true;
}
int j=2;
Node temp = head;
while(temp.next!=null){
if(i==j){
temp.next = temp.next.next;
return true;
}
temp = temp.next;
j++;
}
return false;
}
//对链表进行排序 就是利用未优化的选择排序思想,每次把最小的数放到最左边 (结点指针不变,就只是交换了结点中的val值)
public Node orderList(){
Node curNode = head;
Node nextNode = null;
int temp = 0;
while(curNode.next!=null){
nextNode = curNode.next;
while(nextNode!=null){
if(curNode.val>nextNode.val){
temp = curNode.val;
curNode.val = nextNode.val;
nextNode.val = temp;
}
nextNode = nextNode.next;
}
curNode = curNode.next;
}
return head;
}
//返回链表的长度length
public int length(){
int length=0;
Node temp=head;
while(temp!=null){
length++;
temp=temp.next;
}
return length;
}
//打印
public void print(){
Node temp = head;
while(temp!=null){
System.out.print(temp.val+"->");
temp = temp.next;
}
System.out.println();
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[] arr = new int[5];
BasicOp bo = new BasicOp();
for(int i=0;i<arr.length;i++){
arr[i] = sc.nextInt();
bo.addNodePre(arr[i]); //采用头插法建立链表
}
bo.print();
bo.insert(3, 9);//在第3个位置添加数值为9的结点,此处采用的是在第3个位置后插入的方式
bo.print();
bo.deleteNode(2); //删除第2个结点
bo.print();
bo.orderList();
bo.print();
}
}
运行结果: