1链表结构的定义
struct ListNode
{
int val;//链表的值
ListNode* next;//链表的指针
ListNode() :val(0), next(nullptr) {};//构造函数
ListNode(int x) :val(x), next(nullptr) {};
ListNode(int x, ListNode* node) :val(0), next(node) {};
};
链表设计两个主要的要素,链表的值和链表的指针,设计好一个链表结构体后我们就可以创建一个链表节点:如ListNode* node = new ListNode();
2初始化一整个链表
ListNode* createListNode(int arr[],int n)
{
if (n == 0) return nullptr;
ListNode* dummyhead = new ListNode();
ListNode* cur = dummyhead;
int i = 0;
while (n--)
{
ListNode* node = new ListNode(arr[i++]);
cur->next = node;
cur = cur->next;
}
return dummyhead->next;
}
上面就是将一个数组里的数字创建为一个完整的链表,这里特别强调一下虚拟头结点的重要性。在链表的操作中,我非常的建议大家可以创建一个虚拟的头结点,这样在涉及到头结点的插入,删除等操作下会变得非常的方便。
3 链表的打印输出
void printListNode(ListNode* head)
{
while (head)
{
cout << head->val << " ";
head = head->next;
}
cout << endl;
return;
}
将整个链表打印输出
4 链表题目应该怎么做
画图!画图!画图!重要的事情说三遍,画图是做链表题的精华,尤其是针对不太熟悉的同学来说更是如此,只要画好了一个链表的结构,我们就知道链表题目该怎么做了,因为涉及到链表的操作无非就那么几个:增,删,改,查
1 在头结点增加一个节点node
node->next = head->next;
head->next = node;
2 删除头结点后的一个节点
head->next = head->next->next;
3修改节点node的值为value
node->val = value;
4查找链表中的某个节点node
while(!head)
{
if(head == node) break;
head = head->next;
}
5 常见的链表题
最经典最经典的:
1 LRU:解决思路----双向链表加哈希表
2 循环链表:快慢指针
2 翻转链表:利用一个prev节点
4 交换两个相邻的节点:考验链表基本功
5 设计链表:很考验基础能力
非常推荐把上面说到的内容做一下,做完链表部分应该会有相当大的收获!