iT邦幫忙

0

Linked List 如何 push_front

Lizh 2019-11-24 17:49:361186 瀏覽
  • 分享至 

  • xImage

小弟我想請問我的 push_front 出了甚麼問題? 逐步執行看似都沒問題但總在跳出 push_font 後 list 依然沒有改變。

而且為何這問題沒有在 push_back 出現 , 我是依照相同的想法下去寫的。

#include<iostream>
using namespace std;

struct ListNode {
	int val;
	ListNode* next;
	ListNode(int x) : val(x), next(NULL) {}
};

void push_front(ListNode* list, int n) {
	if (list->val == 0) {
		list->val = n;
		return;
	}
	ListNode* front = new ListNode(n);
	front->next = list;
	list = front;
}
void push_back(ListNode* list, int n) {
	if (list->val == 0) {
		list->val = n;
		return;
	}
	ListNode* back = new ListNode(n);
	while (list->next != NULL) {
		list = list->next;
	}
	list->next = back;
}
void printlist(ListNode* list) {
	while (list != NULL) {
		cout << list->val << " ";
		list = list->next;
	}
	cout << endl;
}

int main() {
	ListNode* L1 = new ListNode(NULL);
	push_back(L1, 2);
	push_back(L1, 4);
	push_back(L1, 3);
	push_front(L1, 4);
	printlist(L1);
	return 0;
}
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

2
海綿寶寶
iT邦大神 1 級 ‧ 2019-11-24 23:05:18
最佳解答

你的程式中
「L1永遠指的是同一個節點」(value=2 那個)
由於 push_back, push_front 都不會改變 L1 的值
所以不管再怎麼 push_back, push_front
L1 都不會改變

底下把 push_front 稍微改了一點點
目的是改成「L1永遠指的是第一個節點」(push_back不變,push_front要改)
參考看看

選我正解

#include<iostream>
using namespace std;

struct ListNode {
	int val;
	ListNode* next;
	ListNode(int x) : val(x), next(NULL) {}
};

ListNode* push_front(ListNode* list, int n) {
	if (list->val == 0) {
		list->val = n;
		return NULL;
	}
	ListNode* front = new ListNode(n);
	front->next = list;
	//list = front;
	return front;
}
void push_back(ListNode* list, int n) {
	if (list->val == 0) {
		list->val = n;
		return;
	}
	ListNode* back = new ListNode(n);
	while (list->next != NULL) {
		list = list->next;
	}
	list->next = back;
}
void printlist(ListNode* list) {
	while (list != NULL) {
		cout << list->val << " ";
		list = list->next;
	}
	cout << endl;
}

int main() {
	ListNode* L1 = new ListNode(NULL);
	push_back(L1, 2);
	push_back(L1, 4);
	push_back(L1, 3);
	L1 = push_front(L1, 4);
	printlist(L1);
	return 0;
}
Lizh iT邦新手 5 級 ‧ 2019-11-26 11:30:02 檢舉

我也自己試出這個答案了,不過一直不懂原理!感謝說明~

2
小魚
iT邦大師 1 級 ‧ 2019-11-24 19:17:02

L1是一個位址,
即使你在函數裡面重新指向,
L1還是原來那個位址,
我之前做Linked List是把開頭的那個放棄,
第一個next開始才是真正的資料所在,
開頭的那個永遠都是固定的,
其實我不知道正統的方式應該是怎麼做的.

我要發表回答

立即登入回答