데이터 구조 - 자바 구현 싱글 체인 시트

5674 단어 데이터 구조
1. 자바 단일 체인 시트 의 정의 실현
//               
class Node {
	Node next = null;
	int data;
	public Node(int data) {
		this.data = data ;
	}
}


2. 자바 단일 체인 시트 의 증가, 삭제, 정렬 실현
import java.util.Hashtable;
public class MyLinkedList {
	Node head = null;//      
	/**        
	 * @param d:       
	 */
    public void addNode(int d) {
    	Node newNode = new Node(d);
    	if(head==null) {
    		head = newNode;
    		return;
    	}
		Node tmp = head;
		while(tmp.next != null) {
			tmp = tmp.next;
		}
		//add node to end
		tmp.next = newNode;
	}
    /**
     * @param index:    index   
     * @return     true,    false
     */
    public Boolean deleteNode(int index) {
    	//        
    	if(index<1 || index>length()) {
    		return false;
    	}
    	if(index==1) {
    		head = head.next;
    		return true;
    	}
    	int i=2;
    	Node preNode = head;
    	Node curNode = preNode.next;
    	while(curNode!=null) {
    		if(i == index) {
    			preNode.next = curNode.next;
    			return true;
    		}
    		preNode = curNode;
    		curNode = curNode.next;
    		i++;
    	}
    	return true;
    }
    /**
     * @return        
     */
    public int length() {
    	int length = 0;
    	Node tmp = head;
    	while(tmp != null) {
    		length ++;
    		tmp = tmp.next;
    	}
    	return length;
    }
    /**       
     * @return          
     */
    public Node orderList() {
    	Node nextNode= null;
    	int temp = 0;
    	Node curNode = head;
    	while(curNode.next != null) {
    		nextNode = curNode.next;
    		while(nextNode != null) {
    			if(curNode.data > nextNode.data) {
    				temp = curNode.data;
    				curNode.data = nextNode.data;
    				nextNode.data = temp;
    			}
    			nextNode = nextNode.next;
    		}
    		curNode = curNode.next;
    	}
    	return head;
    }
    /**        data
     * 
     */
    public void printList() {
    	Node temp = head;
    	while( temp != null) {
    		System.out.println(temp.data);
    		temp = temp.next;
    	}
    }
}


3. 싱글 체인 시트 의 마지막 k 번 째 요 소 를 찾 아 라.
  • 사고 1: 먼저 단일 체인 표를 한 번 훑 어보 고 전체 단일 체인 표 의 길 이 를 구 한 다음 에 마지막 k 개 를 정수 n - k - 1 개 로 바 꾸 고 그 다음 에 다시 한 번 훑 어보 면 결 과 를 얻 을 수 있다.질문: 두 번 반복
  • 사고 2: 처음부터 끝까지 링크 의 특정한 요 소 를 옮 겨 다 닌 다. 만약 에 k 개의 요 소 를 옮 겨 다 닌 후에 링크 의 끝 에 도착 하면 이 요 소 는 바로 찾 아야 할 마지막 k 번 째 요소 이다.문제: 알고리즘 시간 복잡 도 O (kn), 효율 이 너무 낮 음
  • 사고 3: 우 리 는 두 개의 인용 (또는 지침 을 설정 할 수 있 습 니 다. 물론 자바 에는 지침 이 없 지만 이 인용 과 지침 이 비슷 합 니 다), 빠 른 지침, 느 린 지침 을 설정 할 수 있 습 니 다. 빠 른 지침 이 k - 1 단계 로 이동 한 다음 에 두 개의 지침 이 동시에 이동 합 니 다. 그러면 우리 가 빠 른 지침 이 null (링크 꼬리 의 next) 인지 판단 하기 만 하면 됩 니 다. 만약 에 그렇다면...느 린 포인터 가 가리 키 는 위 치 는 바로 찾 아야 할 위치 이다.
  •     /**  
         * @param k:   k   
         */
        public Node findElem(Node head,int k) {
        	if(k<1) {
        		return null;
        	}
        	Node p1 = head;
        	Node p2 = head;
        	for(int i=0;i

    4. 싱글 체인 시트 의 중간 지점 찾기
  • 사고 1: 먼저 단일 체인 표 의 길 이 를 계산 한 다음 에 length / 2 의 거 리 를 옮 겨 다 니 면 단일 체인 표 의 중간 결산 점 을 찾 을 수 있다.문제: 두 번 의 단일 체인 시트
  • 사고 2: 두 개의 지침, 빠 른 지침 은 한 번 에 두 걸음, 느 린 지침 은 한 번 에 한 걸음, 빠 른 지침 이 링크 의 끝 에 이 르 렀 을 때 느 린 지침 은 한 개의 체인 표 의 중간 에 도착 했다 (한 개의 체인 표 의 길이 가 홀수 인지 짝수 인지 구분 할 때 느 린 지침 은 바로 중부 이 고 짝수 일 때 느 린 지침 과 그의 다음 결점 은 모두 링크 의 중간 결점 이다)
  •     //          
        public Node searchMid(Node head) {
        	Node p = this.head;
        	Node q = this.head;
        	while(p!=null && p.next!=null && p.next.next!=null) {
        		p=p.next.next;
        		q=q.next;
        	}
        	return q;
        }
    

    5. 끝 에서 끝까지 싱글 체인 시트 출력
  • 사고방식 1: 반전 체인 테이블, 그리고 출력
  •     //    
        public void reverse(Node head) {
        	Node pReverseHead = head;
        	Node pNode = head;
        	Node pPre = null;
        	while(pNode!=null) {
        		Node pNext = pNode.next;
        		if(pNext == null) {
        			pReverseHead = pNode;//                 ,  next null
        		}
        		pNode.next = pPre;
        		pPre = pNode;
        		pNode = pNext;
        	}
        	this.head = pReverseHead;
        }
    
  • 사고 2: 스 택 구조, 선진 적 인 후에 나 오고 재 귀 는 본질 적 으로 스 택 구조 이다.방법: 하나의 노드 에 접근 할 때마다 출력 뒤의 노드 를 재 귀적 으로 출력 한 다음 에 그 자 체 를 출력 합 니 다.
  •     //  
        public void printListReverse(Node pListHead) {
        	if(pListHead != null) {
        		printListReverse(pListHead.next);
        		System.out.println(pListHead.data);
        	}
        }
    

    6. 헤드 포인터 모 르 는 상태 에서 지정 한 노드 삭제
        //      
        public boolean deleteNode(Node n) {
        	//            ,            next  null
        	if(n == null || n.next == null) {
        		return false;
        	}
        	//     
        	//           
        	int temp =n.data;
        	n.data = n.next.data;
        	n.next.data = temp;
        	//         
        	n.next = n.next.next;
        	return true;
        	
        }
    

    7. 중복 데이터 삭제
     /**      
         * 
         */
    	//     ,       ,         
        public void deleteDuplecate1(Node head) {
        	Hashtable table = new Hashtable();
        	Node temp = head;
        	Node pre = null;
        	while(temp != null) {
        		if(table.containsKey(temp.data)) {
        			pre.next = temp.next;
        		}else {
        			table.put(temp.data, 1);//      
        			pre = temp;
        		}
        		temp = temp.next;
        	}
        }
        //       ,          
        public void deleteDuplecate2(Node head) {
        	Node p = head;
        	while(p != null) {
        		Node q = p;
        		while(q.next != null) {
        			if(p.data == q.next.data) {
        				q.next = q.next.next;
        			}else {
        				q = q.next;
        			}
        			p = p.next;
        		}
        	}
        }
    

    좋은 웹페이지 즐겨찾기