java的链表实现,步骤如下:
1.定义一个节点类:
//定义链表的节点类,里面专门存储下一个元素和数据 public class Node { public Node next; public int date; public Node(int date) { this.date = date; } public void PrintDate() { System.out.print(date + " "); } }
2.定义链表类:
public class LinkedList { private Node head; private int Length; public LinkedList() { head = new Node(0);// head只是用来搜寻数据用的,所以里面存放的数据为空 Length = 0; } // 定义插入函数,分别表示在哪个位置和插入哪个数 public void Insert(int position, int date) { if (position < 1 || position > Length + 1) System.out.println("这个要求插入的数已经越界"); else { Node temp = head;// 表示将头指针给一个中转变量 for (int i = 1; i < position; i++) { temp = temp.next; } Node NewNode = new Node(date);// 定义一个新的节点,专门用来存储插入的数 NewNode.next = temp.next; temp.next = NewNode; Length++; } } // 定义一个输出函数 public void PrintOut() { if (Length == 0) System.out.println("这个链表为空"); else { Node temp = head.next; for (int i = 1; i <= Length; i++) { temp.PrintDate(); temp = temp.next; } } } // 定义一个删除函数 public int delete(int position) { if (position < 1 || position > Length + 1) System.out.println("这个删除的数越界"); Node temp = head; for (int i = 1; i < position; i++) { temp = temp.next; } int date = temp.next.date;// 保存这个被删除的数 temp.next = temp.next.next; Length--; return date; } // 得到链表中数据的长度 public int getLength() { return Length; } // 继续定义一个插入函数,这个插入函数与前面插入函数的不同在于这个函数可以进行排序,有利于 // 进行下面的合并函数 public void SortLinkedList(int date) { Node newNode = new Node(date); if (Length == 0) { head.next = newNode; Length++; } else { Node temp = head.next; for (int i = 1; i <= Length; i++) { if (newNode.date <= temp.date) { newNode.next = temp.next; temp.next = newNode; break; } if(i>=2) temp=temp.next;//关键性一步 } temp.next=newNode; Length++; } } // 定义一个合并函数,用来合并两个链表(用递增的方式合并) public void CombineList(LinkedList list1, LinkedList list2) { LinkedList listCombine = new LinkedList(); // 首先先定义两个链表的头指针中转变量 Node temp1 = list1.head.next;// 表示指向list1第一个数据 Node temp2 = list2.head.next;// 表示指向list2的第一个数据 // 表示任意一个链表的长度到达结尾时,终止循环 while (temp1 != null && temp2 != null) { if (temp1.date <= temp2.date) { // 在合并的链表中,我们把数据默认的情况下插入表尾 listCombine.Insert(listCombine.Length + 1, temp1.date); temp1 = temp1.next; } else { listCombine.Insert(listCombine.Length + 1, temp2.date); temp2 = temp2.next; } } while (temp1 != null) { listCombine.Insert(listCombine.getLength() + 1, temp1.date); temp1 = temp1.next; } while(temp2 != null) { listCombine.Insert(listCombine.getLength() + 1, temp2.date); temp2 = temp2.next; } listCombine.PrintOut(); } }
3.测试代码与截图:
public class TestLinkedList { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub LinkedList list=new LinkedList(); for(int i=1,j=1;i<10;i++,j++){ list.Insert(i, j);//测试插入是否可以实现, } list.PrintOut(); LinkedList list1=new LinkedList(); LinkedList list2=new LinkedList(); for(int i=0;i<10;i++){ list1.SortLinkedList(i); } for(int j=10;j<20;j++){ list2.SortLinkedList(j); } //测试使用第二种插入方法,可不可以进行排序 list1.PrintOut(); System.out.println(); list2.PrintOut(); System.out.println(); //测试是否可以进行合并 new LinkedList().CombineList(list1,list2); } }
转载于:https://blog.51cto.com/8831691/1401167