数据结构的编程实验,源码如下:
利用Java的泛型编程,以及链表类全部手动实现
// 循环链表 import java.io.*; import java.util.*; @SuppressWarnings("unchecked") class LinkList>{ private Node head; LinkList(){ head = null; } static class Node >{ T data; Node next; Node(T data, Node next){//中间节点使用此构造方法 this.data = data; this.next = next; } Node(T data){ //头尾节点使用此构造方法 this.data = data; this.next = this; } } void addHead(T point){ //为链表增加头节点 head = new Node (point); } //void addTail(T point){ //为链表增加尾节点 // tail = new Node (point); // head.next = tail; //} void insert(T point){ if (point.compareTo(head.data) < 0){ Node newNode = new Node(point,head); head = newNode; }else { Node preNext = head; while (preNext.next != head && point.compareTo(preNext.next.data) > 0){ preNext = preNext.next; } Node newNode = new Node(point,preNext.next); preNext.next = newNode; } } void show(){//打印链表 Node cur = head; if (!isEmpty()){ System.out.print(cur.data + " "); cur = cur.next; while (cur != head){ System.out.print(cur.data + " "); cur = cur.next; } System.out.println(); }else { System.out.println("链表错误"); } return ; } boolean isEmpty(){ //判断链表是否为空 if(head != null){ return false; } return true; } void delete(T data){ //删除某一节点 Node curr = head,prev = head; boolean b = false; //System.out.println(head.data); if (curr.data.equals(data)){ while (prev.next != head) prev = prev.next; prev.next = head.next; head = prev; b = true; return ; } curr = head.next; while(curr != head){ if(curr.data.equals(data)){ //判断是什么节点 if(curr == head){ //如果删除的是头节点 //System.out.println("delete head node"); head = curr.next; b = true; return; } if(curr.next == head){ //如果删除的是尾节点 //System.out.println("delete tail node"); prev.next = head; b = true; return; } else{ // 如果删除的是中间节点(即非头节点或非尾节点) //System.out.println('n'+"delete center node"); prev.next = curr.next; b = true; return; } } prev = curr; curr = curr.next; } if(b == false){ System.out.println("没有这个数据" + data); } } void solve(int n,int m){ Node preNext = head; //T[] ans = new T[n + 1]; int ansnum = 0; while (preNext.next != preNext){ int cnt = 1; while (cnt < m){ preNext = preNext.next; cnt ++; } System.out.print(preNext.data + " "); //ans[ansnum ++] = preNext.data; delete(preNext.data); preNext = preNext.next; } //for (int i = 0; i < ansnum; i ++){ // System.out.print(ans[i] + " "); //} System.out.println(preNext.data); } } public class ex1{ public static void main(String[] args){ LinkList mylist = new LinkList (); Scanner in = new Scanner(System.in); while (in.hasNext()){ Integer n = in.nextInt(); Integer m = in.nextInt(); mylist.addHead(1); for (int i = 2; i <= n; i ++){ mylist.insert(i); } System.out.println("原顺序"); mylist.show(); System.out.println("出列顺序"); mylist.solve(n,m); } } } /* 显示结果 * 30 6 * 原顺序 * 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 * 21 22 23 24 25 26 27 28 29 30 * 出列顺序 * 6 12 18 24 30 7 14 21 28 5 15 23 2 11 22 3 16 27 10 * 26 13 1 20 17 9 19 29 25 8 4 * 10 6 * 原顺序 * 1 2 3 4 5 6 7 8 9 10 * 出列顺序 * 6 2 9 7 5 8 1 10 4 3 * 8 2 * 原顺序 * 1 2 3 4 5 6 7 8 * 出列顺序 * 2 4 6 8 3 7 5 1 * 40 9 * 原顺序 * 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 * 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 * 出列顺序 * 9 18 27 36 5 15 25 35 6 17 29 40 12 24 38 11 26 1 * 16 32 8 28 4 23 7 31 14 39 30 20 13 10 19 22 37 33 34 21 2 3 * */