1. ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ ?
: ์ฐจ๋ก๋๋ก ์ฐ๊ฒฐ๋ ๋ ธ๋๋ฅผ ํํํด์ฃผ๋ ์๋ฃ๊ตฌ์กฐ
1) ๋จ๋ฐฉํฅ ์ฐ๊ฒฐ๋ฆฌ์คํธ : ๋ ธ๋๋ ๋ค์ ๋ ธ๋๋ฅผ ๊ฐ๋ฅดํจ๋ค.
2) ์๋ฐฉํฅ ์ฐ๊ฒฐ๋ฆฌ์คํธ : ๋ ธ๋๋ ๋ค์ ๋ ธ๋์ ์ด์ ๋ ธ๋๋ฅผ ๊ฐ๋ฅดํจ๋ค.
: ํน์ ์ธ๋ฑ์ค ์ ๊ทผ์ ์์์๊ฐ์ ์ ๊ทผ ๋ถ๊ฐ (์ฒ์๋ถํฐ ~K๋ฒ๊น์ง ๋ฃจํ๋ฅผ ๋๋ ค์ผํ๊ธฐ ๋๋ฌธ)
: ๋ฐ๋ผ์ ์์์ง์ ์์ ์์ดํ ์ถ๊ฐ/์ญ์ ๋ฅผ ์์์๊ฐ์ ํ ์ ์๋ ํน์ ์ดํ๋ฆฌ์ผ์ด์ ์์ ์ ์ฉํ๊ฒ ์ฌ์ฉ๋จ
2. ๋จ๋ฐฉํฅ ์ฐ๊ฒฐ๋ฆฌ์คํธ ๋ง๋ค๊ธฐ
: LinkedList์๋ฃ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๊ตฌํ > head์ ๋ ธ๋์ฃผ์๋ฅผ ์ฐธ์กฐํ๋ ๋ฐฉ๋ฒ ์ฌ์ฉ
: ์ฆ, ๋ ธ๋์ ํ๋๋ก ๋ ธ๋๋ฅผ ์ฐ๊ฒฐ
class Node{
Node next=null;
int data;
public Node(int d) {
data=d;
}
void appendToTail(int d) {
Node end=new Node(d);
Node n=this;
while(n.next!=null) {
n=n.next;
}
n.next=end;
}
}
: ํ์ง๋ง ์์ ๊ฒฝ์ฐ ์ฌ๋ฌ๊ฐ์ฒด๊ฐ ๋์์ head๋ฅผ ์ฐธ์กฐํ๋๊ฒฝ์ฐ head ๋ณ๊ฒฝ์ ์ค๋ฅ๋ฐ์์ฐ๋ ค
๋ฐ๋ผ์ Nodeํด๋์ค๋ฅผ ํฌํจํ๋ LinkedListํด๋์ค๋ฅผ ๋ง๋๋ ๊ฒ์ ๊ถ์ฅ (ํด๋นํด๋์ค์์ head Node๋ณ์๋ง ์ ์)
3. ์ฐ๊ฒฐ๋ฆฌ์คํธ ์ญ์
: ์๋ฐฉํฅ์ ๊ฒฝ์ฐ n.next.prev=n.prev
: ๋จ๋ฐฉํฅ์ ๊ฒฝ์ฐ n.next=n.prev
Node deleteNode(Node head, int d) {
Node n=head;
if(n.data==d) {
return head.next; // head๋ฅผ ์์ง์ธ๋ค
}
while(n.next!=null) {
if(n.next.data==d) {
n.next=n.next.next;
return head; // head๋ ๋ณํ์ง์๋๋ค
}
n=n.next;
}
return head;
}
4. Runner๊ธฐ๋ฒ
: ๋ถ๊ฐํฌ์ธํฐ๊ธฐ๋ฒ
: ๋๊ฐ์ ํฌ์ธํฐ ์ฌ์ฉ > ํ ํฌ์ธํฐ๊ฐ ๋ค๋ฅธ ํฌ์ธํฐ์ ์ง์ ๋ ๊ฐ์๋งํผ ์์ ์์น
: (e.g.) a1, a2, a3, ... b1, b2, b3, ... ์ ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ฅผ a1,b1,a2,b2, ... ์์ผ๋ก ์ ๋ฆฌํ๊ณ ์ถ์ ๊ฒฝ์ฐ(์์๊ฐ์์ง์๊ฐ์ )
=> Runnerํฌ์ธํฐ๋ฅผ Currentํฌ์ธํฐ๋ณด๋ค 2๊ฐ ์์๊ฒ ํ์ฌ Runner๊ฐ ๋๊น์ง ๋๋ฌํ๊ฒฝ์ฐ ๋ค์ ์ ๋ ฌํ๋ ๋ฐฉ๋ฒ
5. ์ฌ๊ท๋ฌธ์
: ์ฐ๊ฒฐ๋ฆฌ์คํธ ๊ด๋ จ ๋ฌธ์ ์ค ์๋น์๋ ์ฌ๊ทํธ์ถ์ ์์กด > ์ฌ๊ท์ ์ ๊ทผ์ ์๋ํด๋ด๋ผ
: ์ฌ๊ทํธ์ถ ๊น์ด๊ฐ n์ธ ๊ฒฝ์ฐ, O(n)๋งํผ์ ๊ณต๊ฐ ์ฌ์ฉ
: ์ฌ๊ทํธ์ถ์ ๋ฐ๋ณต(iterator)ํํ๋ก ๊ตฌํ๊ฐ๋ฅํ์ง๋ง ๋ฐ๋ณต์ด ์กฐ๊ธ๋ ๋ณต์กํ ์ ์๋ค๋ ์ ์ ๊ธฐ์ต!
6. LinkedListNode๋ฅผ ๊ตฌํํ ํด๋์ค : ๋ผ์ด๋ธ๋ฌ๋ฆฌ
public class LinkedListNode {
public LinkedListNode next, prev, last;
public int data;
public LinkedListNode() {
// TODO Auto-generated constructor stub
}
public LinkedListNode(int d) {
data=d;
}
public LinkedListNode(int d, LinkedListNode n, LinkedListNode p) {
data=d;
setNext(n);
setPrevious(p);
}
public void setNext(LinkedListNode n) {
next=n;
if(this==last) {
last=n;
}
if(n!=null&&n.prev!=this) {
n.setPrevious(this);
}
}
public void setPrevious(LinkedListNode p) {
prev=p;
if(p!=null&&p.next!=this) {
p.setNext(this);
}
}
public LinkedListNode clone() {
LinkedListNode next2=null;
if(next!=null) {
next2=next.clone();
}
LinkedListNode head2=new LinkedListNode(data, next2, null);
return head2;
}
}
๋๊ธ