而是在每一个节点里存到下一个节点的信息(相当与C++的指针)。
链表的主要操作:增,删,查,改,其它。
1.增加一个链表元素:
/** * 加入链表元素,加到尾部 */ public void add(Object obj) { Node node = new Node(obj); if (head == null) { head = node; } else { last.next = node; } last = node; }
2.删除一个链表元素 :
/** * 删除第一个出现链表元素的node.obj=obj */ public void delete(Object obj) { Node node = head; Node node1 = null; while (node != null && !node.obj.equals(obj)) { node1 = node; node = node.next; } System.out.println("node.obj= " + node.obj); if (node == null) { System.out.println("找不到所要删除的元素"); } else { if (node1 != null) { node1.next = node.next; } else { head = node.next; } } }
3.修改一个链表元素
/** * 修改下标的index的元素,从0开始 */ public void modify(int index, Object obj) { Node node; node = head; for (int i = 0; i < index && node != null; i++) { node = node.next; } if (node == null) { System.out.println("找不到所要修改的元素"); } else { node.obj = obj; } }
4.查找一个链表元素:
/** * 查找第一个出现链表元素的node.obj=obj */ public int find(Object obj) { Node node = head; int index = 0; while (node != null && !node.obj.equals(obj)) { index++; node = node.next; } if (node == null) { System.out.println("找不到所要查找的元素"); return -1; } else { return index; } }
5.约瑟夫问题:
/** * 约瑟夫问题 */ public Node yueSeFu(int n,int k,int m){ Node head1=null; Node front=null; list1=new List(); for(int i=0;i<n;i++){ list1.add(""+(i+1)); } int index=0; list1.last.next=list1.head;//不要错指head(都是粗心惹的祸) Node node = list1.head; if(k==1){ front=list1.last; }else{ while (node != null) { index++; if(index==k-1){ front=node; break; } node = node.next; } } // head1=front.next; System.out.println("aaaaaaaafront.obj= "+front.obj); index=1; node = head1; while (true) { if(index==m){ index=0; n--; // System.out.println("删除 "+front.next.obj); front.next=front.next.next; }else{ front=front.next; } index++; if(n==1){ break; } } return front; }
6.链表是否相交:
/** * 判断两个链表是否相交 */ public boolean isJiao(List list1){ Node head1=list1.head; Node node = head; while (node != null) { Node node1=head1; while(node1!=null){ if(node1.equals(node)){ System.out.println("node.obj= "+node.obj); return true; } node1=node1.next; } node = node.next; } return false; }
7.链表是否是环状:
/** * 判断链表是否有环 */ public Node isCircle(){ Node node = head; int index=0; while (node != null) { node = node.next; Node node1=head; int i=0; while(i<index){ if(node1.equals(node)){ return node1; } node1=node1.next; i++; } index++; } return null; }
8.链表逆置:
/** * 对链表逆置(用头插法建一个链表) */ public void nizhi() { Node head1 = new Node(head.obj); Node node1 = new Node(head.obj); Node node = head; while (node != null) { Object obj = node.obj; node1 = new Node(obj); node1.next = head1; head1 = node1; System.out.println("obj = " + node.obj); node = node.next; } head = node1; }
9.链表排序:
/** * 对链表进行排序(这个只是一个值排序,结点排序还有问题) */ public void sort(){ Node node=head; while(node!=null){ Node node1=node.next; while( node1!=null ){ if( Integer.parseInt((String)node.obj) > Integer.parseInt((String)node1.obj) ){ Object obj=node1.obj; node1.obj=node.obj; node.obj=obj; } node1=node1.next; } node=node.next; } }
感想:链表的操作会经常指向同一段内存,以至可能会出现node的next会出现乱指的问题,
我也遇到了好多这样的问题,所以一定当指向一段内存时,一定要仔细点。最好是画
图,这样思绪才会更清晰。[/color]