주문 링크 목록 :
키 값별로 정렬하십시오. 체인 헤더를 삭제하면 최소 (/최대) 값이 삭제됩니다. 삽입 할 때 삽입 위치를 검색하십시오.
삽입 할 때는 O (N), 평균 O (N/2)를 비교하고 체인 헤드에서 최소 (/최대) 데이터를 삭제할 때 효율은 O (1)입니다.
애플리케이션에 가장 작은 (/최대) 데이터 항목에 대한 자주 액세스 (삽입/찾기/삭제)가 필요한 경우 주문한 링크 된 목록이 좋은 선택입니다. 우선 순위 큐는 순서 링크 된 목록을 사용하여 삽입 된 링크 된 목록의 삽입 분류를 구현할 수 있습니다.
순서가없는 배열의 경우 순서대로 링크 된 목록으로 정렬하면 비교 시간 수준은 O (n^2)입니다.
복사 시간 레벨은 O (2*N)입니다. 사본 수가 작기 때문에 링크 된 목록의 데이터는 처음으로 n 번 이동 한 다음 링크 된 목록에서 배열로 복사됩니다. n 번, 새 링크가 삽입 될 때마다 이동 데이터를 복사 할 필요가 없으며, 하나 또는 두 개의 링크 만 링크 도메인을 변경하면됩니다.
import java.util.arrays; java.util.random import; / *** 순서 링크 된 목록에 삽입 배열* @author stone*/ public class linkedlistinsertsort <t 확장 <t >> {private link <t> 먼저; // 첫 번째 노드 public inlinkedListinsertsort () {} public boolean isempty () {return first == null; } public void sortlist (t [] ary) {if (ary == null) {return; } // 링크 된 목록에 배열 요소를 삽입하고 (t data : ary) {insert (data); } //} public void insert (t data) {// 체인 헤더에 삽입, 작은 링크에서 큰 링크로 정렬 <t> newlink = new Link <t> (data); link <t> current = first, previous = null; while (current! = null && data.compareto (current.data)> 0) {previous = current; current = current.next; } if (previous == null) {first = newlink; } else {previous.next = newlink; } newlink.next = current; } public link <t> deletefirst () {// 체인 헤더 링크 <t> temp = first; 첫 번째 = first.next; // 첫 번째 노드를 임시로 변경합니다. } public link <t> find (t t) {link <t> find = first; while (find! = null) {if (! find.data.equals (t)) {find = find.next; } else {break; }} 찾기 찾기; } public link <t> delete (t t) {if (isempty ()) {return null; } else {if (first.data.equals (t)) {link <t> temp = first; 첫 번째 = first.next; // 첫 번째 노드를 다음 노드로 변경합니다. }} link <t> p = 먼저; 링크 <t> q = 첫 번째; while (! p.data.equals (t)) {if (p.next == NULL) {// 류가 체인 끝에서 return null이 발견되지 않았 음을 나타냅니다. } else {q = p; p = p.next; }} q.next = p.next; 반환 p; } public void displayList () {// Travel System.out.println ( "list (첫 번째-> last) :"); 링크 <t> current = 첫 번째; while (current! = null) {current.displayLink (); current = current.next; }} public void displayListReverse () {// 횡선 트래버스 링크 <t> p = first, q = first.next, t; (q! = null) {// 포인터가 반전되면, 트래버스 데이터 순서는 후진 t = q.next; // no3 if (p == first) {// 원래 헤더 일 때 헤더의 .next는 비어 있어야합니다. p.next = null; } q.next = p; // no3-> no1 포인터 리버스 p = q; // start는 리버스 q = t입니다. // no3 start} // 위의 루프의 if에서 first.next는 비어 있고 Q가 null이고 루프를 실행하지 않을 때 p는 가장 원래의 데이터 항목입니다. 반전 후, P는 첫 번째 = P에 할당된다. displayList (); } 클래스 링크 <t> {// 링크 지점 t 데이터; // 데이터 필드 링크 <T> 다음; // 후속 포인터, 노드 체인 도메인 링크 (t data) {this.data = data; } void displayLink () {System.out.println ( "데이터는" + data.toString ()); }} public static void main (String [] args) {linkedListinsertsort <integer> list = new LinkedListinsertsort <integer> (); 랜덤 random = new random (); int len = 5; 정수 [] ary = new Integer [len]; for (int i = 0; i <len; i ++) {ary [i] = random.nextint (1000); } system.out.println ( "--------------"); System.out.println (Arrays.toString (ary)); System.out.println("-----------------------------------------------------------); list.sortList(ary); list.displayList(); } }
인쇄
--- 정렬하기 전에 ---- [595, 725, 310, 702, 444] --- 링크 된 목록을 정렬 한 후 ---- 목록 (첫 번째-> 마지막) : 데이터는 444입니다. 데이터는 595입니다. 데이터는 702입니다. 데이터는 725입니다.
단일 링크리스트 반전 :
public class singlelinkedlistreverse {public static void main (String [] args) {node head = new Node (0); 노드 온도 = null; 노드 cur = null; for (int i = 1; i <= 10; i ++) {temp = 새 노드 (i); if (i == 1) {head.setnext (temp); } else {cur.setNext (temp); } cur = 온도; } // 10.next = null; 노드 h = 헤드; while (h! = null) {system.out.print (h.getData () + "/t"); h = h.getnext (); } system.out.println (); // 1 // h = node.reverse1 (헤드); // while (h! = null) {// system.out.print (h.getData () + "/t"); // h = h.getnext (); //} // 반전 2 h = node.reverse1 (헤드); while (h! = null) {system.out.print (h.getData () + "/t"); h = h.getnext (); }}}/** 단일 링크 된 목록의 각 노드에는 다음 노드를 가리키는 속성이 포함되어 있습니다*/클래스 노드 {객체 데이터; // 데이터 객체 노드 다음; // 다음 노드 노드 (객체 d) {this.data = d; } 노드 (객체 d, 노드 n) {this.data = d; this.next = n; } public Object getData () {return data; } public void setData (객체 데이터) {this.data = data; } public node getNext () {return next; } public void setNext (Node Next) {this.next = next; } // 메소드 1 헤드는 정적 노드 reverse1 (노드 헤드) {node p = null; // 반전 노드 후 새 헤드 Q = 헤드; // 회전 결과 : 012,123,234, ...... 10 null null while (head.next! = null) {p = head.next; // 첫 번째는 두 번째로 대체되고 P는 다음 헤드를 나타냅니다 .next = p.next; // 두 번째는 세 번째로 대체되고 이미 첫 번째 위치에 도달 한 다음 첫 번째 위치는 첫 번째 위치가되고 첫 번째는 첫 번째 위치가 될 것입니다. // 새 것이 첫 번째로 대체됩니다} return p; } // 메소드 2 헤드는 정적 노드 리버스 2 (노드 헤드)를 재설정하지 않습니다 {// 중간 노드의 포인터를 이전 노드로 가리키면 링크 된 목록을 뒤로 뒤로 이동할 수 있습니다. // 전면, 중간 및 후면/회전 결과 : 012, 123, 234, 345, 456 .... 9 10 널 (p2! = null) {p3 = p2.next; p2.next = p1; // 거꾸로 가리키고 앞으로 p1 = p2를 가리 킵니다. // 2, 3은 앞으로 이동한다 p2 = p3; } head.next = null; // 헤드가 변경되지 않았습니다. 출력이 0에 도달하면 0.next to 1 return p1; }}