链表与栈、队列一样,是一种基本的数据结构,有着不支持随机访问的特点。
以单向链表(也是较为常见的)为例,都应包含一个元素和一个存储下一个节点的指针。
struct ListNode
{
int data;
ListNode* next;
}
下面给出关于链表的一些基本操作。
1.通过数组来创建一个链表:
constract1 方法是将元素依次插入链表的后面。
constract2 方法是将元素依次插入链表的前面。
ListNode* constract1(int* nums,int n)
{
ListNode* head = NULL;
ListNode* runner = NULL;
for(int j=0;j<n;j++)
{
ListNode* node = new ListNode();
node->data = nums[j];
if(j==0)
{
head = runner = node ;
continue;
}
runner->next = node;
runner = node ;
}
return head;
}
ListNode* constract2(int* nums,int n)
{
ListNode* head = NULL;
for(int j=n-1;j>=0;j--)
{
ListNode* node = new ListNode();
node->data = nums[j];
if(j==n-1)
{
head = node ;
continue;
}
node->next = head;
head = node;
}
return head;
}
int main()
{
int nums[8] = {1,2,3,4,5,6,7,8};
ListNode* head = 自己写吧。
}
2 链表的插入,参照上面的代码,插入给定节点的前面和后面。
void pushInBefore(ListNode* &head, int num)
{
ListNode* node = new ListNode();
node->data = num;
node->next = head;
head = node;
}//这里用引用确保修改了传进来的head。
void pushInAfter(ListNode* head, int num)
{
ListNode* node = new ListNode();
node->data = num;
node->next = head->next;
head->next = node;
}
3.链表的删除操作。删除操作需要知道要删除节点的前面节点。
这里给出删除给定节点之后一个节点的操作(假定这个节点后面一定有节点)
void delete(ListNode* node)
{
ListNode* temp = node->next->next;
node->next = NULL;
node->next = temp;
}
4.反转一个链表,即将其中元素逆序排列。
ListNode* reverse1(ListNode* node)
{
ListNode* p=nullptr;
ListNode* q = nullptr;
while(node)
{
p = node;
node = node->next;
p->next = q;
q = p;
}
return p;
}