package com.company;import java.util.Stack;/*** @author:抱着鱼睡觉的喵喵* @date:2021/2/4* @description:*/
public class LinkedListDemo {//test模块public static void main(String[] args) {Node node4 = new Node(4, 96, "Ronin");Node node1 = new Node(2, 100, "lisi");Node node2 = new Node(1, 99, "张三");Node node3 = new Node(3, 63, "zsh");Node node5 = new Node(5, 65, "zms");SingleLinkedList singleLinkedList = new SingleLinkedList();SingleLinkedList singleLinkedList2 = new SingleLinkedList();
//        singleLinkedList.add(node1);
//        singleLinkedList.add(node2);singleLinkedList.insert(node4);singleLinkedList.insert(node1);singleLinkedList.insert(node2);singleLinkedList2.insert(node3);singleLinkedList2.insert(node5);mergeLinkedList2(singleLinkedList,singleLinkedList2);int num1 = getLength(singleLinkedList.getNode());int num2 = getLength(singleLinkedList2.getNode());if (num1 >= num2) {singleLinkedList.list();} else {singleLinkedList2.list();}//        singleLinkedList.delete(5);//        System.out.println(getLength(singleLinkedList.getNode()));
//        System.out.println(getReciprocalNode1(singleLinkedList.getNode(),2));
//        System.out.println("链表反转后的数据如下:");
//        getReverse2(singleLinkedList.getNode());
//        singleLinkedList.list();
//        stackPrint(singleLinkedList.getNode());}//计算链表长度public static int getLength(Node node) {if (node.next == null) {return 0;}int length = 0;Node cur = node.next;while (cur != null) {length++;cur = cur.next;}return length;}/*** 计算链表倒数k个节点的数据* 思路:1.计算链表总长度* 2.倒数第k个数据,也就是正数第length-k+1个数据* 3.遍历链表到第length-k+1个数据** @param head* @param k* @return*/public static Node getReciprocalNode1(Node head, int k) {if (head.next == null) {return null;}int size = getLength(head);if (k <= 0 || k > size) {return null;}Node temp = head.next;for (int i = 0; i < (size - k); i++) {temp = temp.next;}return temp;}/*** 链表的反转 方法1* 思路:1.反转相当于数据的更换(1和n,2和n-1,3和n-2)n为链表的长度* 2.通过遍历进行数据的更换,n/2为循环退出的条件** @param head* @return*/public static void getReverse(Node head) {if (head.next == null) {System.out.println("LinkedList is empty!");return;}int length = getLength(head);int num1 = 0;int num2 = 0;Node mid = new Node();for (int i = 1, j = length; i <= length / 2; i++, j--) {Node temp = head;Node cur = head;while (true) {temp = temp.next;num1++;if (num1 == i) {num1 = 0;break;}}while (true) {cur = cur.next;num2++;if (j == num2) {num2 = 0;break;}}mid.sno = temp.sno;mid.score = temp.score;mid.data = temp.data;temp.sno = cur.sno;temp.score = cur.score;temp.data = cur.data;cur.sno = mid.sno;cur.score = mid.score;cur.data = mid.data;}Node temp2 = head.next;while (temp2 != null) {System.out.println(temp2);temp2 = temp2.next;}}/*** 链表的反转2* 思路:* 初始化一个新的头节点reverseHead,然后遍历链表head,利用头插法向reverseHead进行插入** @param head*/public static void getReverse2(Node head) {if (head.next == null) {System.out.println("LinkedList is empty!");return;}Node reverseHead = new Node(0, 0, "");Node cur = null;Node temp = head.next;while (temp != null) {cur = temp.next;temp.next = reverseHead.next;reverseHead.next = temp;temp = cur;}head.next = reverseHead.next;}/*** 单链表的逆序打印,不改变原先单链表的结构* 思路:栈** @param head 单链表的头节点*/public static void stackPrint(Node head) {if (head.next == null) {System.out.println("LinkedList is empty!");return;}Stack<Node> stack = new Stack<>();Node cur = head.next;while (cur != null) {stack.push(cur);cur = cur.next;}while (stack.size() > 0) {System.out.println(stack.pop());}}public static void mergeLinkedList(Node head1, Node head2) {Node temp = head1;int num1 = getLength(head1);int num2 = getLength(head2);if (num1 == 0 || num2 == 0) {return;}Node next = head2.next;if (num1 >= num2) {for (int i = 0; i < num2; i++) {boolean flag = false;while (true) {if (temp.next == null) {break;}if (head2.next == null) {return;}if (temp.next.sno > head2.next.sno) {break;}if (temp.next.sno == head2.next.sno) {flag = true;break;}temp = temp.next;}if (flag == true) {System.out.println("数据" + head2.next.sno + "发生了重复!");} else {next = next.next;head2.next = temp.next;temp = head2.next;head2 = next;}}}}/*** 合并两个链表,并且按照有序合并* @param singleLinkedList1 链表1* @param singleLinkedList2 链表2*/public static void mergeLinkedList2(SingleLinkedList singleLinkedList1, SingleLinkedList singleLinkedList2) {int num1 = getLength(singleLinkedList1.getNode());int num2 = getLength(singleLinkedList2.getNode());if (singleLinkedList1.getNode().next == null || singleLinkedList2.getNode().next == null) {return;}if (num1 >= num2) {Node cur = singleLinkedList2.getNode().next;Node cur2 = null;while (cur != null) {cur2 = cur.next;singleLinkedList1.insert(cur);cur = cur2;}} else {Node temp = singleLinkedList1.getNode().next;Node temp2 = null;while (temp != null) {temp2 = temp.next;singleLinkedList2.insert(singleLinkedList1.getNode());temp = temp2;}}}
}//节点类
class Node {public Node next;public int sno;public int score;public String data;public Node() {}public Node(int Sno, int NScore, String Data) {this.sno = Sno;this.score = NScore;this.data = Data;}@Overridepublic String toString() {return "Node{" +"sno=" + sno +", score=" + score +", data='" + data + '\'' +'}';}
}//链表操作类
class SingleLinkedList {private Node head = new Node(0, 0, ""); //初始化头节点public Node getNode() {return head;}// add student datapublic void add(Node node) {        //数据添加Node temp = head;while (temp.next != null) {temp = temp.next;}temp.next = node;}//outputpublic void list() {            //遍历数据进行打印Node temp = head.next;if (temp == null) {System.out.println("LinkedList is empty!");} else {while (temp != null) {System.out.println(temp);System.out.println();temp = temp.next;}}}//insert by order 1  有序插入/*  public void insert(Node node) {       //插入数据方式1 Node temp = head.next;while (temp != null) {      //determine whether the node's sno is the sameif (temp.sno == node.sno) {System.out.println("the student ID:" + node.sno + " already exists!");return;}temp = temp.next;}Node temp2 = head;Node tail = head.next;while (temp2 != null) {if (head.next == null) {    //Determine whether the inserted node is the first nodehead.next = node;break;} else if (tail.next == null) {     //determine whether the inserted node is the tail nodeif (tail.sno < node.sno) {tail.next = node;break;} else {temp2.next = node;node.next = tail;break;}} else if (tail.sno < node.sno) {       //insert according to the student snotemp2 = temp2.next;tail = tail.next;} else {                        //inserttemp2.next = node;node.next = tail;break;}}} *///insert by order 2 有序插入public void insert(Node node) {      //插入数据方式2Node temp = head;boolean flag = false;while (true) {if (temp.next == null) {break;}if (temp.next.sno > node.sno) {break;} else if (temp.next.sno == node.sno) {flag = true;break;}temp = temp.next;}if (flag) {System.out.println("Student ID :" + node.sno + "already exists!");return;} else {node.next = temp.next;temp.next = node;}}public void modify(Node newNode) {           //修改操作Node temp = head.next;if (head.next == null) {System.out.println("LinkedList is empty,unable to modify!");return;}boolean flag = false;while (true) {if (temp == null) {break;}if (temp.sno == newNode.sno) {flag = true;break;}temp = temp.next;}if (flag) {temp.score = newNode.score;temp.data = newNode.data;} else {System.out.println("No student ID" + newNode.sno);}}public void delete(int sno) {        //删除操作Node temp = head;boolean flag = false;if (head.next == null) {System.out.println("LinkedList is empty,Unable to delete.");return;}while (true) {if (temp.next == null) {break;}if (temp.next.sno == sno) {flag = true;break;}temp = temp.next;}if (flag) {temp.next = temp.next.next;} else {System.out.println("No student ID:" + sno);}}/*** 计算链表中第倒数k个数据* 思路:1.计算链表总长度* 2.倒数第k个数据,也就是正数第length-k+1个数据* 3.遍历链表到第length-k+1个数据** @param k* @return*/public Node getReciprocalKNode2(int k) {if (head.next == null) {System.out.println("LinkedList is empty");return null;}Node temp = head.next;int num = 0;while (true) {if (temp == null) {break;}num++;temp = temp.next;}if (k > num || k <= 0) {System.out.println(k + "Has exceeded the length of the linkedList!");return null;}int dif = num - k + 1;int num2 = 0;Node cur = head.next;while (true) {num2++;if (dif == num2) {break;}cur = cur.next;}return cur;}}

数据结构和算法之单链表相关推荐

  1. 数据结构与算法:单链表(利用万能指针实现对任意类型数据进行操作)

    前言 C语言的指针真的很强大,万能指针更强大,可以指向任意类型的数据.在上篇博客 数据结构与算法:单链表(超详细实现)中用C语言实现了单链表的相关算法,不过却有局限性 只能针对某一种数据类型还是不够强 ...

  2. 数据结构与算法之单链表

    数据结构与算法之单链表 //链表的实现/*实现单链表的 构建.数据添加.数据删除(返回元素所在位置).数据查找(返回元素所在的位置)的算法设计:*/ //链表的实现/*实现单链表的 构建.数据添加.数 ...

  3. 数据结构与算法:单链表(超详细实现)

    实现算法预览 这次博主写的单链表主要实现了以下算法.所有功能可进行循环运行测试.欢迎各位指正. LinkList.h #pragma once #ifndef __LINKLIST_H__ #defi ...

  4. 数据结构与算法之单链表(1)

    在说头插法建立单链表之前,先补充几个知识点: 用typedef定义类型:意思就是可以用typedef声明新的类型名来代替已有的类型名. 例如: typedef struct { int month; ...

  5. 数据结构与算法篇-单链表

    ????????关注后回复 "进群" ,拉你进程序员交流群???????? 作者丨写代码的牛顿 来源丨编程学习总站 01 - 单链表结点定义以及操作函数声明 我们知道在C语言里数组 ...

  6. (数据结构与算法)单链表与双链表增删改查的实现。

    文章目录 链表介绍 1. 单链表应用实例 1.1 实现思路 1.2 代码实现 2.单链表常见面试题 2.1 求单链表中有效节点的个数 2.2 查找单链表中倒数第K个节点 2.3 单链表的反转 2.4 ...

  7. java宋江,Java编程内功-数据结构与算法「单链表」,

    package com.structures.linkedlist; public class SingleLinkedListDemo { public static void main(Strin ...

  8. 【数据结构与算法】单链表的Java实现

    链表 数据结构的逻辑表示有4种类型: 集合:元素之间无关 线性:元素之间1->1的关系 树:元素之间1->many的关系 图:元素之间many->many的关系 最基础的线性结构的简 ...

  9. 【数据结构与算法】单链表的插入和删除

最新文章

  1. 【 C 】用动态数组实现堆栈
  2. CSS Hack-清除浮动的最简单写法V2010-08
  3. 安装Axis2的eclipse插件后,未出现界面
  4. 独自学习/组团学习,什么情境下采用效果更好?
  5. 远行星号java 出错_打了势力争霸之后就出错了
  6. 风电功率预测_人工智能在预测单机风电功率上的应用进展
  7. struts2登陆拦截器
  8. Intel(R) Matrix Storage Manager 介绍
  9. java字符常量_字符常量 java
  10. 零延时RS-485接口电路的设计与应用
  11. Oracle (08)JDBC
  12. typora主题-orangeheart
  13. un7.28:redis客户端常用命令。
  14. geany怎么创建文件夹_安装 Geany
  15. Android电视清理系统应用,【教程】无需root!卸载小米电视/盒子内置应用竟如此简单...
  16. html输入时从本文框的顶格输入,浙江省绍兴市越城区2017—2018学年八年级第二学期期末语文试卷(15页)-原创力文档...
  17. 偏向锁的获取和撤销详解
  18. php薄饼,潮州薄饼的做法_家常潮州薄饼的做法【图】潮州薄饼的家常做法大全怎么做好吃视频 - 美食杰...
  19. 西门子培训2——OID
  20. Lumerical Suite 2015a windows_linux光学设计软件

热门文章

  1. html标签处理数据时合并空格
  2. 关于删除数据仓库的数据
  3. 面向搜索的中文分词设计
  4. java写龟兔赛跑_简单的实现java多线程——龟兔赛跑
  5. mysql 数值类型 长度_mysql中的数据类型的长度
  6. 万稞pw80线切割编程软件_线切割机床的控制系统的现状
  7. caj在线阅读_用翻译软件快速阅读大量英文文献
  8. java flex xml_FLEX与JAVA的交互问题 -DOM4J-xml
  9. java是如何写入文件的
  10. python区块链开发_10个开源的Python区块链项目