链表简单操作

[color=green]链表:是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,
              而是在每一个节点里存到下一个节点的信息(相当与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]

猜你喜欢

转载自allagain.iteye.com/blog/1859939