Code IT/Data-Structure
[자료구조] LinkedList 연결 리스트
찾
2021. 4. 3. 02:40
학생 객체를 노드로 받아서 연결리스트로 표현하기.
- dirty code 안되도록 더 노력해보기.
import java.io.*;
class Node { //리스트의 노드 객체 생성
int studentId;
String studentName;
Node next;
}
class List { // 리스트 생성
Node first;
List() {
first = null; // 헤더 역할. first
}
}
public class LinkedListTest { //메인 & 메서드
public static void main(String args[]) throws IOException {
BufferedReader br = new BufferedReader(new FileReader("input.txt"));
List list = new List();
String line;
while ((line = br.readLine()) != null) {
String student[] = line.split(" ");
Node newNode = new Node();
if (student.length > 1) { //학생 추가, 삭제의 경우 id를 추가로 받아와야 함
newNode.studentId = Integer.parseInt(student[1]);
if (student.length > 2) { // 추가의 경우에는 name까지 받아와야 함
newNode.studentName = student[2] + " " + student[3];
}
}
newNode.next = null;
if (student[0].equals("i"))
Insert(newNode, list);
if (student[0].equals("d"))
Delete(newNode, list);
if (student[0].equals("f"))
Find(newNode, list);
if (student[0].equals("p"))
Print(list);
}
br.close();
}
static void DeleteList(List list) { // 리스트 삭제
if (!IsEmpty(list)) {
list.first = null;
}
}
static boolean IsEmpty(List list) {
if (list.first == null)
return true;
return false;
}
static boolean IsLast(Node node, List list) {
if (node.next == null)
return true;
return false;
}
static void Delete(Node node, List list) { // 노드 삭제
if (Find(node, list) > 0) {
Node temp = list.first;
while (temp.next != null) { //노드의 다음이 null이 될 때 중단됨
Node left = temp;
Node right = left.next;
if (right.studentId == node.studentId) { // 만약 다음 노드가 삭제할 노드라면
left.next = right.next; // 현 노드의 다음 노드를 다다음 노드로 설정하고
right.next = null; // 다음 노드는 null로 설정한다 (삭제)
}
temp = temp.next;
}
System.out.println("Deletion Success : " + node.studentId);
System.out.print("Current List> ");
Print(list);
} else // 해당 student 없음, 삭제 불가
System.out.println("Deletion Failed : element " + node.studentId + " is not in the list.");
}
static int Find(Node node, List list) {
Node temp = list.first;
while (temp != null) { // while로 쭉 돌면서 id 같으면 1 return
if (temp.studentId == node.studentId) {
return node.studentId;
}
temp = temp.next;
}
return 0;
}
static void Insert(Node newNode, List list) {
if (Find(newNode, list) == 0) { // 리스트에 해당 학번 없을 경우에
Node temp = list.first;
if (list.first == null) { // 비어있는 리스트일 경우 첫 노드로 추가
list.first = newNode;
System.out.println("Insertion Success : " + newNode.studentId);
System.out.print("Current List> ");
Print(list);
} else if (temp.studentId > newNode.studentId) { // 첫 노드보다 값이 작을 경우에 리스트의 첫 노드로 추가해야 함
list.first = newNode;
newNode.next = temp;
System.out.println("Insertion Success : " + newNode.studentId);
System.out.print("Current List> ");
Print(list);
} else { // 리스트의 첫 부분에 들어가는 거 아닐 경우에
while (temp.next != null) { // 자리 찾은 경우
if (temp.studentId < newNode.studentId && temp.next.studentId > newNode.studentId) {
Node left = temp;
Node right = temp.next;
left.next = newNode;
newNode.next = right;
// 왼쪽 노드left와 오른쪽 노드right 각각 잡아서 left.next가 newNode를 가리키게 하고
// newNode.next을 right로 설정하면 insert 완료
System.out.println("Insertion Success : " + newNode.studentId);
System.out.print("Current List> ");
Print(list);
break;
}
temp = temp.next; // 리스트의 마지막에 insert 하는 경우
if (temp.next == null) {
Node left = temp;
left.next = newNode;
newNode.next = null;
System.out.println("Insertion Success : " + newNode.studentId);
System.out.print("Current List> ");
Print(list);
break;
}
}
}
} else // 학번 이미 존재. insert 불가
System.out.println("Insertion Failed : element " + newNode.studentId + " is already in the list.");
}
static void Print(List list) {
Node temp = list.first;
while (temp != null) {
System.out.print(temp.studentId + " " + temp.studentName + " ");
temp = temp.next;
}
System.out.println();
}
}