728x90
package main

import "fmt"


type Node struct {
	next *Node
	val  int
}
//결합성 높이고 의존성 줄여~
//관련있는 애들 묶어주자. 하나의 struct으로 묶기


//1. 새 struct만듦
type LinkedList struct { 
	//루트를 포인트형으로 가지고 있음
	root *Node
	tail *Node
}

//2. 메서드 3개 추가함  add remove printNode
//LinkedList가 가지고 있는기능, 메서드
func (l *LinkedList) AddNode(val int) {
	if l.root ==nil {
		//없는 상태면
		//루트는, 새로만든 노드의 메모리 주소를 포인트 형태로 갖고 있고
		l.root = &Node{val:val}
		//테일은 자료가 없으니까 루트랑 똑같음
		l.tail= l.root
		return
	}
	//꼬리 다음을 새로운 노드 만들어서 붙이면 됨
	l.tail.next = &Node{val:val}
	l.tail= l.tail.next
}


func  (l *LinkedList)  RemoveNode(node *Node ) {
	if node == l.root {
		l.root = l.root.next 
		node.next = nil
		return
	}

	prev := l.root
	for prev.next != node {
		
		prev = prev.next

	}
	if node== l.tail {
		prev.next = nil
		l.tail = prev
	} else {
		prev.next= prev.next.next
	}
	node.next = nil
}



func (l *LinkedList)  PrintNodes() {
	//그다음 노드가 없을때까지 전진
	node := l.root
	for node.next != nil {
		fmt.Printf("%d -> ",node.val)
		node = node.next
	}
	fmt.Printf("%d\n",node.val)
}


func main() {
	//이안에 root와 tail 포함되어있어서 따로 만들 필요 없음
	list := &LinkedList{}
	list.AddNode(0)

	// var root *Node
	// var tail *Node
	// //노드의 주소를 root로 가지고 있음
	// root = &Node{val: 0}
	// //맨처음꺼 하나만 있을 때는 tail은 root와 같음
	// tail= root

	for i:=1; i<10; i++ {
		// tail= AddNode(tail,i)
	    list.AddNode(i)
	}
	
	list.PrintNodes()



   list.RemoveNode(list.root.next)

	list.PrintNodes()

    list.RemoveNode(list.root)
	list.PrintNodes()

	list.RemoveNode(list.tail)
	list.PrintNodes()
	fmt.Printf("tail:%d\n", list.tail.val)

}

// //노드 추가하는 거를 함수로 만들게요 //새로 추가된 노드로 반환값있어야함
// func AddNode(tail *Node, val int) *Node {

// 	// var tail *Node
// 	// tail = root
// 	// for tail.next != nil {
// 	// 	tail = tail.next
// 	// }
// 	//맨 마지막에 새 노드 추가
// 	node := &Node{val: val}
// 	tail.next = node
// 	return node

// }


// func RemoveNode(node *Node,root *Node, tail *Node ) (*Node, *Node) {
// 	//내가 지우고자 하는 노드가 맨 앞인 경우
// 	if node == root {
// 		//새로운 루트는 기존 루트의 다음이 됨
// 		root = root.next
// 		if root == nil {
// 			tail= nil
// 		}
// 		return root, tail

// 	}
// 	//이전 노드 다음이 현재 지우고자 하는 노드가 아니면
// 	//이전을 이전다음으로 보내. 맞게 되면 for문 빠져나가 
// 	prev := root
// 	for prev.next != node {
		
// 		prev = prev.next

// 	}
// 	if node== tail {
// 		prev.next = nil
// 		tail = prev
// 	} else {
// 		prev.next= prev.next.next
// 	}

// 	return root, tail
// }

// func PrintNodes(root *Node) {
// 	//그다음 노드가 없을때까지 전진
// 	node := root
// 	for node.next != nil {
// 		fmt.Printf("%d -> ",node.val)
// 		node = node.next
// 	}
// 	fmt.Printf("%d\n",node.val)
// }
728x90
728x90

함수 호출 과정은 무조건 복사로 이뤄진다

복사 일어날 때 값이 복사되는 거지

그 메모리가 그대로 전달되는 게 아님~~!!!

 

이걸 해결하기 위해서 포인터가 나옴

 

//

 

객체, 구조체에 대해 알아봤고

구조체는 속성 모아놓은거임

기능을 가질 수도 있음 (함수)

 

속성, 기능 가지고 있는게 구조체

 

 

 

 

 

https://youtu.be/59SpbJX5kTI

 

728x90

+ Recent posts