总结下来主要的难度是确定当前的是否是最后一个元素,很多时候要将这种情况区分开来处理,有点麻烦。
其实链表的处理自我感觉还是比较简单的
public class test {
public static void main(String[] args){
SingleLinkedListHead head=new SingleLinkedListHead();
head.add( new StudentNode( 1,"张三" ) );
head.add( new StudentNode( 2,"李四" ) );
head.add( new StudentNode( 3,"王五" ) );
head.addByPosition( 2,new StudentNode( 4,"王五" ) );
head.show();
head.delete( 2 );
head.show();
head.update( 1,new StudentNode( 7,"test" ) );
head.show();
}
}
class SingleLinkedListHead{
//头节点
StudentNode head=new StudentNode( 0,"头结点" );
//插入到尾部
public void add(StudentNode studentNode){
StudentNode temp=head;
while(true){
if(temp.next==null){
break;
}else{
temp=temp.next;
}
}
temp.next=studentNode;
}
//插入到指定位置
public void addByPosition(int a,StudentNode studentNode){
StudentNode temp=head;
while(a>1){
if(temp==null){
System.out.println("插入错误,指定位置大于链表长度");
}
temp=temp.next;
a--;
}
if(temp.next==null){
temp.next=studentNode;
}else{
studentNode.next=temp.next;
temp.next=studentNode;
}
}
//输出链表
public void show(){
if(head.next==null){
System.out.println("链表为空");
return;
}else {
System.out.println( "链表输出如下" );
StudentNode temp = head.next;
while (true) {
if (temp == null) {
break;
}
System.out.println( temp );
temp=temp.next;
}
}
}
//删除操作
public void delete(int a){
StudentNode temp=head;
while(a>1){
if(temp==null){
System.out.println("删除错误,指定位置为空");
}
temp=temp.next;
a--;
}
if(temp.next==null){
System.out.println("删除错误,指定位置为空");
}else{
temp.next=temp.next.next;
}
}
//修改操作
public void update(int a,StudentNode studentNode){
StudentNode temp=head;
while(a>1){
if(temp==null){
System.out.println("修改错误,指定位置为空");
}
temp=temp.next;
a--;
}
if(temp.next.next==null){
temp.next=studentNode;
}else{
studentNode.next=temp.next.next;
temp.next=studentNode;
}
}
}
class StudentNode{
int stuNo;
String stuName;
StudentNode next;
public StudentNode(int stuNo,String stuName){
this.stuNo=stuNo;
this.stuName=stuName;
}
@Override
public String toString() {
return "StudentNode{stuNo=" + stuNo +
", stuName=" + stuName +"}";
}
}
相关扩展:
链表的相关面试题:
1.获取单链表的倒数第k个元素:
解体思路:
我们不可能从尾巴开始读取单链表的数据,但是我们可以先遍历获取总长度,然后再遍历到size-k的位置
2.讲单链表倒置
public void reversetList(){
if(head.next==null||head.next.next==null){
return;
}
StudentNode tempHead=new StudentNode( 0,"临时头结点" );
StudentNode temp=head.next;
StudentNode next=null;
while(temp!=null){
next=temp.next;
temp.next=tempHead.next;
tempHead.next=temp;
temp=next;
}
head.next=tempHead.next;
}
3.逆序输出单链表:
方式一:先倒置,再输出(会破坏单链表的结构)
方式二:利用栈,先进后出(Stack)