๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algoritm/Coding Interview

[2.์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ] LinkedList, ์žฌ๊ท€, LinkedListNode

by ๐Ÿ’œautumn 2020. 8. 25.

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;
	}

}

 

 

 

๋Œ“๊ธ€