数据结构与算法~数据结构之单链表

总结下来主要的难度是确定当前的是否是最后一个元素,很多时候要将这种情况区分开来处理,有点麻烦。

其实链表的处理自我感觉还是比较简单的


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)

 

1.算法是程序的灵魂,优秀的程序在对海量数据处理时,依然保持高速计算,就需要高效的数据结构算法支撑。2.网上数据结构算法的课程不少,但存在两个问题:1)授课方式单一,大多是照着代码念一遍,数据结构算法本身就比较难理解,对基础好的学员来说,还好一点,对基础不好的学生来说,基本上就是听天书了2)说是讲数据结构算法,但大多是挂羊头卖狗肉,算法讲的很少。 本课程针对上述问题,有针对性的进行了升级 3)授课方式采用图解+算法游戏的方式,让课程生动有趣好理解 4)系统全面的讲解了数据结构算法, 除常用数据结构算法外,还包括程序员常用10大算法:二分查找算法(非递归)、分治算法、动态规划算法、KMP算法、贪心算法、普里姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法、马踏棋盘算法。可以解决面试遇到的最短路径、最小生成树、最小连通图、动态规划等问题及衍生出的面试题,让你秒杀其他面试小伙伴3.如果你不想永远都是代码工人,就需要花时间来研究下数据结构算法。教程内容:本教程是使用Java来讲解数据结构算法,考虑到数据结构算法较难,授课采用图解加算法游戏的方式。内容包括: 稀疏数组、单向队列、环形队列、单向链、双向链、环形链、约瑟夫问题、栈、前缀、中缀、后缀达式、中缀达式转换为后缀达式、递归与回溯、迷宫问题、八皇后问题、算法的时间复杂度、冒泡排序、选择排序、插入排序、快速排序、归并排序、希尔排序、基数排序(桶排序)、堆排序、排序速度分析、二分查找、插值查找、斐波那契查找、散列、哈希、二叉树、二叉树与数组转换、二叉排序树(BST)、AVL树、线索二叉树、赫夫曼树、赫夫曼编码、多路查找树(B树B+树和B*树)、图、图的DFS算法和BFS、程序员常用10大算法、二分查找算法(非递归)、分治算法、动态规划算法、KMP算法、贪心算法、普里姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法马踏棋盘算法。学习目标:通过学习,学员能掌握主流数据结构算法的实现机制,开阔编程思路,提高优化程序的能力。
©️2020 CSDN 皮肤主题: 黑客帝国 设计师:上身试试 返回首页