package com.algorithm.tiger.linkedlist; / ** * 연결된 목록 (연결된 여러 노드로 구성됨) * * @description : 단일 연결 목록 * @author : tiger * @create : 2020-07-11 11:05 * / public class MyLinkedList { // 링크드리스트 의 선두에있는 프라이빗 노드 헤드; // 링크드리스트의 끝에있는 프라이빗 노드 꼬리; // 링크드리스트 의 실제 크기 private int size; public Node find (int index) { // 비정상 조건 예측 if (index <0 | | index> size) { throw new IndexOutOfBoundsException ( "연결된 목록 노드의 범위를 벗어났습니다!"); } if (size == 0) { // 빈 연결 목록 반환 null; } else if (인덱스 == 0) { // Head return head; } else if (size == index) { // Tail return tail; } else { // 중간 (인덱스의 노드 노드에 도달 할 때까지 헤드에서 순회) Node targetNode = head; for (int i = 0; i <index; i ++) { targetNode = targetNode.next; } return targetNode; } } / ** * 삽입 요소 (머리 삽입, 중간 삽입, 꼬리 삽입) * * @param data * @param index * @return * / public Node insert (int data, int index) { // 비정상 상태 예측 if (index <0 || index> size) { throw new IndexOutOfBoundsException ( "연결된 목록 노드의 범위를 벗어 났습니다 !"); } // 삽입 된 노드 Node insertNode = new Node (data); if (size == 0) { // Empty linked list head = insertNode; tail = insertNode; } else if (index == 0) { // 헤드 삽입 // 1. 새 노드의 다음 포인터를 원래 헤드 노드에 가리 킵니다. insertNode.next = head; // 2. 새 노드를 연결 목록의 헤드 노드 head = insertNode; } else if (size == index) { // 꼬리를 삽입 // 1. 원래 꼬리 노드의 다음 노드를 새 노드로 지정 tail.next = insertNode; // 2. 새 노드를 가리 킵니다. 꼬리 노드에 노드 tail = insertNode; } else { // 중간 삽입 (연결된 목록의 검색 방법에 의존) Node prevNode = find (index-1); Node currentNode = prevNode.next; prevNode.next = insertNode; insertNode.next = currentNode; // Refresh from back to front // 노드 prevNode = find (index-1); // // 1. 삽입 위치에있는 노드를 가리키는 새 노드의 다음 포인터 (1과 2는 반전 될 수 없음) // insertNode.next = prevNode.next; // // 2. 삽입 위치에있는 이전 노드 의 다음 포인터, 새 노드를 가리킴 // prevNode.next = insertNode; } size ++; // 삽입 된 새 노드 데이터 반환 return insertNode; } / ** * 요소 삭제, 삭제 된 노드 반환 * @return * * @param index * / public Node remove (int index) { // 비정상 조건 예측 if (index <0 || index> size) { throw new IndexOutOfBoundsException ( "연결된 목록 노드의 범위를 벗어났습니다!"); } Node removeNode = null; if (size == 0) { // 빈 연결 목록 } else if (index == 0) { // 헤드 제거 removeNode = head; head = head.next; } else if (size == index) { // 꼬리 노드 제거 prevNode = find (index-1); removeNode = prevNode.next; prevNode.next = null; tail = prevNode; } else { // 중간 삭제 (연결된 목록 검색 방법에 의존) 노드 prevNode = find (index-1); 노드 nextNode = prevNode.next.next; removeNode = prevNode.next; prevNode.next = nextNode; } 크기-; removeNode를 반환합니다. } public Node getHead () { return head; } public void setHead (노드 헤드) { this.head = 헤드; } public Node getTail () { return tail; } public void setTail (노드 테일) { this.tail = tail; } public int getSize () { return size; } public void setSize (int size) { this.size = size; } @Override public String toString () { return "MyNode {"+ "head ="+ head + ", tail ="+ tail + ", size ="+ size + '}'; } / ** * 노드 내부 클래스 * / private static class Node { // 현재 노드 데이터 private int data; // Next node private Node next; public Node () { } public Node (int data) { this.data = data; } public int getData () { 반환 데이터; } public void setData (int data) { this.data = data; } public Node getNext () { return next; } public void setNext (Node next) { this.next = next; } @Override public String toString () { return "Node {"+ "data ="+ data + ", next ="+ next + '}'; } } / ** * 测试 * * @param args * / public static void main (String [] args) { Node node = new Node (12); MyLinkedList linkedList = new MyLinkedList (); linkedList.insert (12, 0); linkedList.insert (122, 0); linkedList.insert (343, 0); linkedList.insert (1243, 1); linkedList.insert (444444, 1); linkedList.insert (45678, 1); linkedList.insert (333333, 1); System.out.println (linkedList); System.out.println ( "=================="); // System.out.println (linkedList.find (2)); // linkedList.remove (0); // linkedList.remove (0); linkedList.remove (3); System.out.println (linkedList); System.out.println ( "=================="); // LinkedList linkedList1 = new LinkedList (); } }
단일 연결 목록 및 간단한 코드의 아이디어를 실현
추천
출처blog.csdn.net/qq_36336332/article/details/107292032
추천
행