题目
给定数组a,分使用头插法和尾插法建立数组对应的带头结点的单链表。
实现代码
// 定义链表结点结构体
struct ListNode {
int val;
ListNode *next;
};
// 头插法创建链表
ListNode* createLinkedList(vector<int>& a) {
// 创建头结点
ListNode* head = new ListNode();
head->next = nullptr;
for(int x : a){
// 创建新节点
ListNode* newNode = new ListNode();
newNode->val = x;
newNode->next = head->next;
head->next = newNode;
}
return head;
}
// 尾插法创建链表
ListNode* createLinkedListRe(vector<int>& a) {
// 创建头结点
ListNode* head = new ListNode();
head->next = nullptr;
// 创建指向末尾节点的尾指针tail
ListNode* tail = head;
for(int x : a){
// 创建新节点
ListNode* newNode = new ListNode();
newNode->val = x;
newNode->next = nullptr;
tail->next = newNode;
tail = newNode;
}
return head;
}
分析
用两种方式建立单链表有着很多相似的地方:
- 创建头结点
ListNode* head = new ListNode(); head->next = nullptr;
- 创建新节点
ListNode* newNode = new ListNode(); newNode->val = x; // *注意不要忽视next指针的初始化 newNode->next = nullptr;
而最能体现头插法和尾插法思想,也是二者最根本的不同之处就在于二者指向新节点的方式:
// 头插法 - 头结点next指向新节点
head->next = newNode;
// 尾插法 - 尾结点next指向新节点
tail->next = newNode;
tail = newNode; // 更新尾结点