日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

数据结构和算法之单链表

發(fā)布時(shí)間:2024/10/5 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构和算法之单链表 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
package com.company;import java.util.Stack;/*** @author:抱著魚(yú)睡覺(jué)的喵喵* @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("鏈表反轉(zhuǎn)后的數(shù)據(jù)如下:"); // getReverse2(singleLinkedList.getNode()); // singleLinkedList.list(); // stackPrint(singleLinkedList.getNode());}//計(jì)算鏈表長(zhǎng)度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;}/*** 計(jì)算鏈表倒數(shù)k個(gè)節(jié)點(diǎn)的數(shù)據(jù)* 思路:1.計(jì)算鏈表總長(zhǎng)度* 2.倒數(shù)第k個(gè)數(shù)據(jù),也就是正數(shù)第length-k+1個(gè)數(shù)據(jù)* 3.遍歷鏈表到第length-k+1個(gè)數(shù)據(jù)** @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;}/*** 鏈表的反轉(zhuǎn) 方法1* 思路:1.反轉(zhuǎn)相當(dāng)于數(shù)據(jù)的更換(1和n,2和n-1,3和n-2)n為鏈表的長(zhǎng)度* 2.通過(guò)遍歷進(jìn)行數(shù)據(jù)的更換,n/2為循環(huán)退出的條件** @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;}}/*** 鏈表的反轉(zhuǎn)2* 思路:* 初始化一個(gè)新的頭節(jié)點(diǎn)reverseHead,然后遍歷鏈表head,利用頭插法向reverseHead進(jìn)行插入** @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;}/*** 單鏈表的逆序打印,不改變?cè)葐捂湵淼慕Y(jié)構(gòu)* 思路:棧** @param head 單鏈表的頭節(jié)點(diǎn)*/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("數(shù)據(jù)" + head2.next.sno + "發(fā)生了重復(fù)!");} else {next = next.next;head2.next = temp.next;temp = head2.next;head2 = next;}}}}/*** 合并兩個(gè)鏈表,并且按照有序合并* @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;}}} }//節(jié)點(diǎn)類(lèi) 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 + '\'' +'}';} }//鏈表操作類(lèi) class SingleLinkedList {private Node head = new Node(0, 0, ""); //初始化頭節(jié)點(diǎn)public Node getNode() {return head;}// add student datapublic void add(Node node) { //數(shù)據(jù)添加Node temp = head;while (temp.next != null) {temp = temp.next;}temp.next = node;}//outputpublic void list() { //遍歷數(shù)據(jù)進(jìn)行打印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) { //插入數(shù)據(jù)方式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) { //插入數(shù)據(jù)方式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);}}/*** 計(jì)算鏈表中第倒數(shù)k個(gè)數(shù)據(jù)* 思路:1.計(jì)算鏈表總長(zhǎng)度* 2.倒數(shù)第k個(gè)數(shù)據(jù),也就是正數(shù)第length-k+1個(gè)數(shù)據(jù)* 3.遍歷鏈表到第length-k+1個(gè)數(shù)據(jù)** @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;}}

總結(jié)

以上是生活随笔為你收集整理的数据结构和算法之单链表的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。