链表是一种常用的数据结构,链表是通过自引用结构体类型的指针成员指向结构体本身建立起来的。
如下:
typedef struct node
{
int data;
sruct node * next;
}ListNode;
对链表的操作主要有创建,插入,删除等,下面分别讲解:
1.创建
创建链表就是创建一个空的链表,首先明确任务为创建一个链表,我们需要做的是,创建一个头结点head,并将头结点的next设置为NULL
如下:
ListNode* CreateList()
{
ListNode* head = NULL;
head = new ListNode();//创建一个头结点
head->next = NULL;//将头结点next设置为null
return head;
}
2.插入
链表的插入操作是在链表中插入一个节点,这里有两个方式,第一种方式,直接在链表末尾插入节点,第二种方式在指定位置插入节点
第一种方式:需要做的是,找到链表的末尾节点,将末尾的节点的next指向我们需要插入的节点p,然后将p的next设置为NULL
如下:
int InsertNode(ListNode* head, ListNode* p)
{
if(head&&p)
{
ListNode* ptmp = head;
while(ptmp->next) //找到链表的末尾节点
{
ptmp = ptmp->next;
}
ptmp->next = p;//将末尾的节点的next指向我们需要插入的节点p
p->next = NULL;//将p的next设置为NULL
}
return -1;
}
第二种方式:需要做的工作是,找到插入点i的位置节点ptmp,保存ptmp的next节点值,将ptmp的next节点指向需要插入的节点p,将p的next设置为ptmp的next节点值
如下:
int InsertNode(ListNode*head, int i, ListNode* p)
{
i=0;
if(head&&p)
{
ListNode* ptmp = head;
while(i++)//找到插入点i的位置节点q
{
ptmp = ptmp->next;
if(!pTmp)//链表长度不足i,所以在最末尾插入
{
ptmp = p;
p->next = NULL;
return 0;
}
}
p->next = ptmp->next;//保存ptmp的next节点值,将p的next设置为ptmp的next节点值
ptmp->next = p;//将ptmp的next节点指向需要插入的节点p
return 0;
}
return -1;
}
3.删除
链表的删除操作为删除指定的元素,我们需要知道被删除节点的位置或者被删除节点的内容,可以通过节点内容找到对应的节点位置,故只给出删除对应位置节点的操作
我们需要做的工作是,找到删除位置i对应的节点,保存删除节点p的next值,释放节点内存
如下:
int DelListNode(ListNode* head, int i)
{
if(!head)
return -1;
int j = 0;
ListNode* q = NULL;
ListNode* ptmp = head;
while(j++ < i)//找到节点i的位置节点q
{
ptmp = ptmp->next;
if(!pTmp)//链表长度不足i
{
return -1;
}
}
q = ptmp->next;//保存删除节点
ptmp->next = q->next;//保存删除节点p的next值
delete q;//释放节点内存
return 0;
}
ps:水平有限,供参考使用。请大家批评指正,互相学习进步