[과제] 자바_연결리스트_구현

728x90

[소스코드]

[소스코드]
Node.java
                                                                                               
package hwlinkedlist;
public class Node { 
    //필드 
    private String name;
    private int pointSum;
    private Node next;
    //생성자 
    public Node(String n, int pointMath, int pointKorean, int pointEnglish) { 
        this.name = n;
        this.pointSum = pointEnglish + pointKorean + pointMath; 
        next = null;
    }
    
    //Getter, Setter 메소드 
    public String getName() { 
        return name;
    }

    public void setName(String name) { 
        this.name = name;
    }

    public int getPointSum() {  
        return pointSum;
    }

    public void setPointSum(int pointSum) {
        this.pointSum = pointSum;
    }

    public Node getNext() { 
        return next;
    }

    public void setNext(Node next) { 
        this.next = next;
    }
}
                                                                                      








LinkedList.java 
                                                                                                                           
public class LinkedList {
    //필드
    private Node head; 
    //생성자 
    public LinkedList() {
        head = null;
    } 
    //연결리스트 속 head노드 반환 getter 메소드 
    public Node getHead() {
        return head;
    }
   //-----<기능 추가 과제>-------  
    //기능 추가(1)_성적반환: 학생 이름 받아서 해당 학생의 성적 반환하는 메소드 
    public int getPoint(String name) {
        Node currentNode = head;
        
        int Point = -1; // 반환할 성적 변수 -1 초기화
        
        if (currentNode != null) { 
            while (currentNode != null) { 
                if (currentNode.getName().equals(name)) {
                    Point = currentNode.getPointSum();
                    break;
                }
               currentNode = currentNode.getNext();  						
            }
        }
        return Point;
    }
    //기능 추가(2)_삽입: 학생 성적 순으로 삽입 메소드 
    public void insertByPoint(Node node) { 
      
        Node currentNode = this.head; 
        if (currentNode != null) { 
            while (currentNode != null) { 
                if (currentNode.getPointSum() <= node.getPointSum()) { 
                    if (currentNode.equals(this.head)) {
                        this.head = node; 
                        node.setNext(currentNode); 
                    }else { 	
                        int position = getIndex(currentNode.getPointSum()); 
                        Node prevNodeNotHead = this.head;  
                        for (int i = 0; i < position - 1; i++) { 
                            prevNodeNotHead = prevNodeNotHead.getNext(); 
                        }
                        prevNodeNotHead.setNext(node); //앞 연결 
                        node.setNext(currentNode);//뒤 연결 
                    }
                    break;
                }                
                currentNode = currentNode.getNext();//next 따라 다음 노드로 이동  
            }
            //while문 탈출 : 삽입할 node 성적합이 가장 작아 null되어 탈출 
            if (currentNode == null) { 
                currentNode = findLastNode(); //currentNode <- 마지막 노드 지칭
                currentNode.setNext(node); //currentNode.next = 삽입할 node 연결 
            }
        }    
       else { 
            insertLast(node); //현재 node를 마지막 노드로 삽입 
        }
    }
    //기능 추가(3)_삭제: 학생 이름 입력받은 후 해당 학생 노드 삭제 메소드
    public int deleteNode(String name) {
        if (this.head.getName().equals(name)) { 
            this.head = this.head.getNext();  
            return 0; //종료 
        }
        Node currentNode = this.head;
        int deletedIndex = -1; //삭제 위치 지정 변수 -1 초기화
        if (currentNode != null) { 
            while (currentNode != null) { 
                if (currentNode.getName().equals(name)) {
                    deletedIndex = getIndex(name);
                    Node prevNode = this.head; 
                    for (int i = 0; i < deletedIndex - 1; i++) { 
                        prevNode = prevNode.getNext(); 
                    }
                    //for문 탈출 후, 삭제 직전 위치 지칭 중인 prevNode 
                    prevNode.setNext(currentNode.getNext());        
                    break;
                }
                currentNode = currentNode.getNext();
            }
        }
        return deletedIndex; 
    }
    //마지막 노드 삽입 위치 탐색 메소드
    public Node findLastNode() {
        Node n = head; //head부터 순회할 노드 n  
        if (n != null) { 
            while (n.getNext() != null) {  
                n = n.getNext();  
            }
        }
        return n;
    }
    //중간 노드 삽입: 점수 기준으로 삽입 위치 직전 노드 탐색 메소드 
    public Node findPrevNode(int point) { 
        if (head.getPointSum() < point)  return null;
        
        Node n = head, prev = null;
        while (n != null) {  
            if (n.getPointSum() < point) {
                prev = n; 
                n = n.getNext();
            }
        }
        return prev; 
    }





   //마지막 노드로 삽입 메소드 
    public void insertLast(Node n) { 
        if (head == null)  head = n; 
        else {
            Node node = findLastNode(); 
            node.setNext(n); 
        }
    }
   //중간 노드로 삽입 메소드 
    public void insertMiddle(Node n) { 
        Node node = findPrevNode(n.getPointSum()); 
        if (node == null) {  
            n.setNext(head); 
            head = n; 
        }else { 
            n.setNext(node.getNext()); //뒤 연결 
            node.setNext(n);//앞 연결 
        }
    }
    //"point값 기준" -> 위치 반환 메소드 
    public int getIndex(int point) { 
        Node currentNode = this.head; 
        int counter = 0; //위치 카운터 변수
        while (currentNode != null) { 
            if (currentNode.getPointSum() == point) { 
                break; 
            }
            currentNode = currentNode.getNext();
            counter++; 
        }
        return counter; //성적합 기준으로 찾은 노드 인덱스 위치 반환 
    }
    //"name값 기준" -> 위치 반환 메소드 
    public int getIndex(String name) {
        Node currentNode = this.head; 
        int counter = 0; //위치 카운터 변수
        while (currentNode != null) {  
            if (currentNode.getName().equals(name)) { 
                break;
            }
            currentNode = currentNode.getNext();
            counter++; 
        }
        return counter; //이름값 기준으로 찾은 노드 인덱스 위치 반환
    } 
   //전체 순회하며 리스트 전체 출력 메소드 
    public void showAll() {
        if (head == null) System.out.println("연결리스트 내부에 node 객체 없는 상태");
        else {
            Node n = head; 
            do {
                System.out.print("(" + n.getName() + "," + n.getPointSum() + ") -> ");
                n = n.getNext();
            }while (n != null); 
        }
    }
      


    //실행 main메소드 
    public static void main(String[] args) {
        LinkedList list = new LinkedList();
        list.insertByPoint(new Node("김", 95, 38, 79));
        list.insertByPoint(new Node("서", 91, 90, 43));
        list.insertByPoint(new Node("이", 88, 84, 99));
        list.insertByPoint(new Node("황", 62, 49, 82));
        list.insertByPoint(new Node("주", 26, 40, 65));
        list.insertByPoint(new Node("정", 83, 93, 95));
        list.insertByPoint(new Node("구", 69, 47, 81));
        list.insertByPoint(new Node("강", 5, 84, 13));
        list.insertByPoint(new Node("선", 27, 54, 28));
        list.insertByPoint(new Node("우", 45, 4, 13));
        
        System.out.println("\n\n----삽입 완료된 상태 출력----\n\n");
        list.showAll();
        
        System.out.println("\n\n '서 학생' 삭제 후 출력 ");
        list.deleteNode("서");
        System.out.println("\n");
        list.showAll();
        
        System.out.println("\n\n '이 학생' 삭제 후 출력 ");
        list.deleteNode("이");
        System.out.println("\n");
        list.showAll();
        
        System.out.println("\n\n '김 학생' 삭제 후 출력 ");
        list.deleteNode("김");
        System.out.println("\n");
        list.showAll();     
    }

}

 

[실행화면]

 

[코드설명]

-->[노드 변경]

-노드 객체 생성 시,

(이름, 국어, 영어, 수학)를 받아서 (이름, 성적합) 구조로 노드 객체가 생성되어야 하므로

노드 클래스의 생성자를 변경했다.



//생성자

public Node(String n, int pointMath, int pointKorean, int pointEnglish) { //이름, 국,영,수 세 과목 받아서

this.name = n;

this.pointSum = pointEnglish + pointKorean + pointMath; //성적합을 노드 pointSum필드값에 저장

next = null;

}

-노드 객체를 삽입,삭제 시, 노드 객체의 필드값을 안전하게 변경하고 사용하기 위해

노드의 내부 필드는 private로 바꿔주고, public Getter,Setter() 메소드를 추가했다.

//필드

private String name;

private int pointSum;

private Node next;



//Getter, Setter 메소드



public String getName() { //노드 객체의 이름 필드값 -> 외부로 리턴

return name;

}



public void setName(String name) { //호출 시 받은 이름으로 노드 객체의 name필드값 변경

this.name = name;

}



public int getPointSum() { //노드 객체의 성적합 -> 외부로 리턴

return pointSum;

}



public void setPointSum(int pointSum) { //호출 시 받은 성적합으로 노드 객체의 pointSum필드값 변경

this.pointSum = pointSum;

}



public Node getNext() {//노드 객체의 next필드값 -> 외부로 리턴

return next;

}



public void setNext(Node next) { //호출 시 받은 next값으로 노드 객체의 next필드값 변경

this.next = next;

}

-->[추가한 메소드 (1)] : int getPoint(String)

: 학생 이름 인수로 받아서, 해당 학생의 성적 반환

: 해당 학생 없을 경우 –1 반환

//기능 추가(1)_성적반환: 학생 이름 받아서 해당 학생의 성적 반환하는 메소드

public int getPoint(String name) {

Node currentNode = head; //리스트의 head부터 순회하며 현재 노드 지칭할 노드



int Point = -1; //반환할 성적 변수 –1 초기화, (해당 학생 찾지 못하면 –1 반환하도록)



if (currentNode != null) {

while (currentNode != null) { //순회 중인 노드가 null 아닌 동안 반복



if (currentNode.getName().equals(name)) {//if 현재 노드 name값 = 매개값 name 인 경우



Point = currentNode.getPointSum(); //반환될 Point값에 현재노드의 성적합을 저장

break; //반복문 탈출

}



currentNode = currentNode.getNext();//next필드 따라 다음 노드로 이동

}

}

return Point; //반복문 탈출하여 저장된 성적합을 반환

}



-->[추가한 메소드 (2)] :void insertByPoint(Node)

: 연결리스트에 학생노드를 성적 순 (내림차순) 삽입

-> 리스트 전체를 순회하면서 삽입할 노드의 point 값과 비교하여 삽입 수행해야 한다.



//기능 추가(2)_삽입: 학생 성적 순으로 삽입 메소드

public void insertByPoint(Node node) {



Node currentNode = this.head; //head부터 순회하며 현재 노드 지칭할 노드

if (currentNode != null) {

while (currentNode != null) { //현재노드 null 아닌 동안 반복



if (currentNode.getPointSum() <= node.getPointSum()) {

//만약 현재노드.point <= 삽입 노드 point 인 경우





if (currentNode.equals(this.head)) { //만약 리스트의 head라면

this.head = node; //기존의 head 뒤로 노드 삽입

node.setNext(currentNode); 삽입노드의 next필드 다시 세팅



}else { //head 아닌 경우



int position = getIndex(currentNode.getPointSum());//point기준으로 삽입 위치 찾고

Node prevNodeNotHead = this.head; //head부터 순회하며 직전노드 지칭할 노드



for (int i = 0; i < position - 1; i++) { //for돌면서 삽입위치의 앞노드를 찾음

prevNodeNotHead = prevNodeNotHead.getNext();

}



prevNodeNotHead.setNext(node); //앞 연결 (직전노드의 next에 삽입노드 연결)

node.setNext(currentNode);//뒤 연결 (삽입 노드의 next에 현재노드 연결)

}



break;

}

currentNode = currentNode.getNext();//next 따라 다음 노드로 이동

}



//while로 전체 순회하면서 삽입노드의 성적합이 가장 작아 null되어 탈출한 경우



if (currentNode == null) {

currentNode = findLastNode(); //currentNode <- 마지막 노드 지칭

currentNode.setNext(node); //currentNode.next = 삽입할 node 연결

}

}



else {

insertLast(node); //현재 node를 마지막 노드로 삽입

}

}

-->[추가한 메소드 (3)] : int deleteNode(String)

: 학생 이름 인수로 받아서, 해당 학생노드를 연결리스트에서 삭제

: 해당 학생 없을 경우 –1 반환



//기능 추가(3)_삭제: 학생 이름 입력받은 후 해당 학생 노드 삭제 메소드

public int deleteNode(String name) {



if (this.head.getName().equals(name)) { //만약 head.name == 매개값 name인 경우

this.head = this.head.getNext(); // head의 next노드를 head로 업데이트

return 0; //종료

}



Node currentNode = this.head; //head부터 순회하며 현재 노드 지칭할 노드

int deletedIndex = -1; //삭제 위치 지정 변수 –1 초기화



if (currentNode != null) {

while (currentNode != null) { //현재노드 null아닌 동안 반복하면서



if (currentNode.getName().equals(name)) { //매개값 name과 같은 노드 찾으면



deletedIndex = getIndex(name); //name가진 노드의 위치 찾고



Node prevNode = this.head; //head부터 순회할 노드



//삭제 직전위치까지 for 돌면서 삭제 직전 노드 찾음

for (int i = 0; i < deletedIndex - 1; i++) {

prevNode = prevNode.getNext();

}



prevNode.setNext(currentNode.getNext());//직전노드.next <- 삭제노드.next



break;

}

currentNode = currentNode.getNext();//next따라 다음 노드로 이동하며 while반복

}

}

return deletedIndex; //해당 학생 찾지 못한 경우 –1 반환

}

-->[추가한 메소드 (4)] : void showAll()

: 전체 연결리스트 순회하며 모든 노드의 (이름,성적) 출력



//전체 순회하며 리스트 전체 출력 메소드

public void showAll() {

if (head == null) //만약 head가 null이면 공백 리스트



System.out.println("연결리스트 내부에 node 객체 없는 상태");



else { //공백 리스트 아닌 경우,



Node n = head; //head부터 순회할 노드 n

do {

System.out.print("(" + n.getName() + "," + n.getPointSum() + ") -> ");

n = n.getNext(); //next따라 다음 노드로 이동



}while (n != null); // 노드 n이 null 아닌 동안 반복

}

}
 

728x90