์ฐ๊ฒฐ ๋ฆฌ์คํธ๋?
๋ฐฐ์ด๊ณผ ๋ค๋ฅด๊ฒ ์ฐ์์ ์ธ ๋ฉ๋ชจ๋ฆฌ ์์น์ ์ ์ฅ๋์ง ์๋ ์ ํ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ด๋ฉฐ, ๊ฐ ๋ ธ๋๋ ํฌ์ธํฐ๋ฅผ ์ด์ฉํด ์๋ก๋ฅผ ์ฐ๊ฒฐํ์ฌ ์ ๊ทผํ๋ค.
์ฐ๊ฒฐ๋ฆฌ์คํธ ํน์ง
์ฅ์
- ๋ฐฐ์ด๊ณผ ๋ค๋ฅด๊ฒ ์์์ ์๋งํผ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น๋ฐ์ ํ์๊ฐ ์๋ค.
- ๋ฐฐ์ด๊ณผ ๋ค๋ฅด๊ฒ ๊ณต๊ฐ์ ์ถ๊ฐ๋ก ํ ๋น๋ฐ๊ฑฐ๋ ๋๋จธ์ง ๋ฐ์ดํฐ๋ค์ ์์น๋ฅผ ์ด๋์ํฌ ํ์๊ฐ ์์ด์ ์ฝ์ ๋ฐ ์ญ์ ๊ฐ ์ฉ์ดํ๋ค.
๋จ์
- ๋ฐฐ์ด๊ณผ ๋ค๋ฅด๊ฒ ํน์ ์ธ๋ฑ์ค์ ์์น์ O(1)์ ์ ๊ทผํ์ง ๋ชปํ๊ณ ์์์๋ถํฐ ์์ฐจ์ ์ผ๋ก ์์๋ฅผ ํ์ํด์ผํ๋ค.
- ๊ฐ ๋ ธ๋๊ฐ ๋ฐ์ดํฐ๋ง ๊ฐ์ง๊ณ ์๋ ๊ฒ์ด ์๋, ํฌ์ธํฐ ๋ณ์์ ๊ณต๊ฐ๋ ์ถ๊ฐ์ ์ผ๋ก ํ์ํ๋ค.
์ฝ๋๋ก ๋ณด๋ ์ฐ๊ฒฐ ๋ฆฌ์คํธ
๋ ธ๋ ๊ตฌํ
class Node {
private Node left;
private Node right;
private final int data;
public Node(int data) {
this.data = data;
}
public Node getLeft() {
return left;
}
public Node getRight() {
return right;
}
public int getData() {
return data;
}
public void setLeft(Node left) {
this.left = left;
}
public void setRight(Node right) {
this.right = right;
}
}
- ๋ ธ๋ ํด๋์ค๋ ์ผ์ชฝ ๋ ธ๋์ ์ค๋ฅธ์ชฝ ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์๋ ์ฐธ์กฐ ๋ณ์์ ๋ณด๊ดํ ๋ฐ์ดํฐ ๋ณ์๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
์ฐ๊ฒฐ๋ฆฌ์คํธ ๊ตฌํ
class LinkedList {
private Node head;
private Node tail;
...
}
- ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ ๋งจ ์ฒ์ ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋ head์ ๋ง์ง๋ง ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋ tail์ ๊ฐ์ง๊ณ ์๋ค.
- ๋งจ ์ฒ์ ์๋ฌด๋ฐ ๋ ธ๋๊ฐ ์กด์ฌํ์ง ์์ ๋๋ head์ tail์ด null์ ๊ฐ๋ฆฌํค๊ฒ ๋๋ค.
์ฐ๊ฒฐ๋ฆฌ์คํธ์ ๋ ธ๋ ์ถ๊ฐ ๊ตฌํ
public void addFirst(int data) {
Node node = new Node(data);
if(isEmpty()) {
head = tail = node;
}
else {
node.setRight(head);
head.setLeft(node);
head = node;
}
}
public void addLast(int data) {
Node node = new Node(data);
if(isEmpty()) {
head = tail = node;
}
else {
tail.setRight(node);
node.setLeft(tail);
tail = node;
}
}
- ๊ฐ๊ฐ ๋งจ ์์ ์๋ก์ด node๋ฅผ ๋ฃ๋ ๋ฉ์๋์ ๋งจ ๋ค์ ์๋ก์ด node๋ฅผ ๋ฃ๋ ๋ฉ์๋์ด๋ค.
- ๋ง์ฝ LinkedList๊ฐ ๋น์ด์๋ค๋ฉด head์ tail์ ์๋ก์ด node๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ๋ณ์๋ค์ ์ด๊ธฐํ ํด์ผํ๋ค.
- ๋ง์ฝ LinkedList๊ฐ ๋น์ด ์์ง ์๋ค๋ฉด, head์ ์๋ node๋ฅผ ์๋ก์ด node์ ์ค๋ฅธ์ชฝ์ ์์นํ๋๋ก ์ฐธ์กฐ ๋ณ์๋ค์ ์กฐ์ ํ ํ ๊ธฐ์กด head์ ์๋ก์ด node๋ฅผ ์ฐ๊ฒฐ์์ผ์ค๋ค.
์ฐ๊ฒฐ๋ฆฌ์คํธ์ ๋ ธ๋ ์ ๊ฑฐ ๊ตฌํ
public void remove(int data) {
Node node = head;
while(node != null) {
if(node.getData() == data) {
if(node == head) {
if(node.getRight() != null) {
head = node.getRight();
node.getRight().setLeft(null);
}
else {
head = tail = null;
}
}
else if(node == tail){
tail = node.getLeft();
node.getLeft().setRight(null);
}
else {
node.getLeft().setRight(node.getRight());
node.getRight().setLeft(node.getLeft());
}
node = null;
break;
}
node = node.getRight();
}
}
- head์ tail์ ๋๋ฏธ ๋ ธ๋๋ก ์ฌ์ฉํ์ง ์๊ณ ์ค์ ๋ ธ๋๋ก ์ฌ์ฉํ์ฌ remove ๋ฉ์๋๊ฐ ๊ต์ฅํ ๊ธธ์ด์ก๋ค.
- head์ tail์ด ๋ฐ์ดํฐ๋ฅผ ๋ด๊ณ ์๋ ์๋ฏธ ์๋ ๋ ธ๋์ด๋ฏ๋ก, ์ญ์ ํ ๋ ์๋์ ๊ฐ์ด ๋ง์ ์กฐ๊ฑด์ ํ์ธํด์ผ ํ๋ค.
์ฒซ๋ฒ์งธ. ์ญ์ ํ ๋ ธ๋๊ฐ head์ธ๊ฐ?
๋๋ฒ์งธ. ์ญ์ ํ ๋ ธ๋๊ฐ tail์ธ๊ฐ?
์ธ๋ฒ์งธ. ์ญ์ ํ ๋ ธ๋๊ฐ head, tail๋ ์๋ ์ผ๋ฐ ๋ ธ๋์ธ๊ฐ?
์์ ์กฐ๊ฑด์ ๋ฐ๋ผ ๊ตฌํ ํด์ผํ๋ ๋ก์ง์ด ๋ฌ๋ผ์ง๋ค.
์ฒซ๋ฒ์งธ ์กฐ๊ฑด์ ๊ฒฝ์ฐ head์ ์ค๋ฅธ์ชฝ์ ์๋ ๋ ธ๋๋ฅผ head๋ก ์ฐ๊ฒฐ์์ผ์ค์ผ ํ๋ค. ๋ ๋ง์ฝ์ LinkedList์ head ๋ ธ๋ ๋ฐ์ ์๋ ์ํฉ์ด๋ผ๋ฉด head๋ฅผ ๋จ์ํ null๋ก ์ด๊ธฐํํ๋ค.
๋๋ฒ์งธ ์กฐ๊ฑด์ ๊ฒฝ์ฐ tail์ ์ญ์ ํ ๋ ธ๋์ ์ผ์ชฝ์ผ๋ก ์ฐ๊ฒฐ์์ผ์ค์ผ ํ๋ค. ์ด๋ฏธ head์์ ๋ฐ์ดํฐ๊ฐ ํ๋๋ฐ์ ์๋ ๊ฒฝ์ฐ(head==tail)๋ฅผ ์ฒดํฌํด์คฌ๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ๋ถ๋ถ์ ์ ๊ฒฝ์จ์ค ํ์๊ฐ ์๋ค.
์ธ๋ฒ์งธ ์กฐ๊ฑด์ธ ๊ฒฝ์ฐ ์ญ์ ํ ๋ ธ๋์ ์์ชฝ ๋ ธ๋๋ฅผ ์๋ก ์ฐ๊ฒฐ์์ผ์ฃผ๋ฉด ๋๋ค.
๋ง์ฝ head์ tail์ ๋๋ฏธ๋ ธ๋๋ก ์ฌ์ฉํ๋ค๋ฉด ๋จ์ํ ์ธ๋ฒ์งธ ์กฐ๊ฑด๋ง ๊ตฌํํ๋ฉด ๋๋ค.
์ฐ๊ฒฐ๋ฆฌ์คํธ ์ ์ฒด ์ฝ๋
class Node {
private Node left;
private Node right;
private final int data;
public Node(int data) {
this.data = data;
}
public Node getLeft() {
return left;
}
public Node getRight() {
return right;
}
public int getData() {
return data;
}
public void setLeft(Node left) {
this.left = left;
}
public void setRight(Node right) {
this.right = right;
}
}
class LinkedList {
private Node head;
private Node tail;
public LinkedList() {
head = null;
tail = null;
}
public void addFirst(int data) {
Node node = new Node(data);
if(isEmpty()) {
head = tail = node;
}
else {
node.setRight(head);
head.setLeft(node);
head = node;
}
}
public void addLast(int data) {
Node node = new Node(data);
if(isEmpty()) {
head = tail = node;
}
else {
tail.setRight(node);
node.setLeft(tail);
tail = node;
}
}
public void remove(int data) {
Node node = head;
while(node != null) {
if(node.getData() == data) {
if(node == head) {
if(node.getRight() != null) {
head = node.getRight();
node.getRight().setLeft(null);
}
else {
head = tail = null;
}
}
else if(node == tail){
tail = node.getLeft();
node.getLeft().setRight(null);
}
else {
node.getLeft().setRight(node.getRight());
node.getRight().setLeft(node.getLeft());
}
node = null;
break;
}
node = node.getRight();
}
}
public boolean isEmpty() {
return head == null;
}
}