单链表
创建链表
typedef struct ListNode {
int val;
ListNode* next;
ListNode(int x) : val(x), next(NULL) {}
};
按位序插入节点
带头结点
bool ListInsert(LinkList& L, int i, int value) {
if (i < 1) {
return false;
}
LNode* p;
int j = 0;
p = L;
while (p != NULL && j < i - 1) {
p = p->next;
j++;
}
if (p == NULL) {
return false;
}
ListNode* s = new ListNode(value);
s->next = p->next;
p->next = s;
return true;
}
不带头结点
bool ListInsert2(ListNode* head, int i, int value) {
if (i < 1) {
return false;
}
if (i == 1) {
ListNode* s = new ListNode(value);
s->next = head;
head = s;//头结点指向s
return true;
}
ListNode* p = head;
int j = 1;//当前p指向第几个节点
while (j < i - 1 && p != NULL) {//找到第i-1个节点
p = p->next;
j++;
}
if (p == NULL) {
return false;
}
else {
ListNode* s = new ListNode(value);
s->next = p->next;
p->next = s;
return true;
}
}
指定节点的后插操作
bool InsertNextNode(ListNode* p, int value) {
ListNode* s = new ListNode(value);
if (p == NULL) {
return false;
}
s->next = p->next;
p->next = s;
return true;
}
指定节点的前插操作
bool InsertPriorNode(ListNode* p, int value) {
//前插操作
if (p == NULL) {
return false;
}
ListNode* s = new ListNode(value);
s->next = p->next;
p->next = s;
//赋值(偷天换日)
//链表结构都相同 插在前边 和在后边加一个节点 相互赋值的效果相同
s->val = p->val;
p->val = value;
return true;
}
删除节点
bool DeleteNodeToNum(ListNode* head, int i) {
if (i < 1) {
return false;
}
ListNode* p=head;
int j = 0;
while (p != NULL && j < i - 1) {
p = p->next;
j++;
}//找到第i-1个节点
if (p == NULL) {
return false;
}
ListNode* q = p->next;
p->next = q->next;
return true;
}
查找操作
按位查找
ListNode* GetElem(ListNode* head, int value){
int j = 0;
if (value < 0) {
return NULL;
}
ListNode* p = head;
while (p != NULL && j < value) {
p = p->next;
j++;
}
return p;
}
按值查找
//按值查找结点
ListNode* GetValue(ListNode* head,int value) {
ListNode* p = head;
while (p != NULL && p->val != value) {
p = p->next;
}
return p;
}
下面我给出我这里单链表的源码
typedef struct ListNode {
int val;
ListNode* next;
ListNode(int x) : val(x), next(NULL) {}
};
//头头结点的插入
bool ListInsert(ListNode* L, int i, int value) {
//带头结点
if (i < 1) {
return false;
}
ListNode* p;
int j = 0;
p = L;
while (p != NULL && j < i - 1) {
p = p->next;
j++;
}
if (p == NULL) {
return false;
}
ListNode* s = new ListNode(value);
s->next = p->next;
p->next = s;
return true;
}
//无头节点的插入
bool ListInsert2(ListNode* head, int i, int value) {
if (i < 1) {
return false;
}
if (i == 1) {
ListNode* s = new ListNode(value);
s->next = head;
head = s;//头结点指向s
return true;
}
ListNode* p = head;
int j = 1;//当前p指向第几个节点
while (j < i - 1 && p != NULL) {//找到第i-1个节点
p = p->next;
j++;
}
if (p == NULL) {
return false;
}
else {
ListNode* s = new ListNode(value);
s->next = p->next;
p->next = s;
return true;
}
}
//后插操作
bool InsertNextNode(ListNode* p, int value) {
ListNode* s = new ListNode(value);
if (p == NULL) {
return false;
}
s->next = p->next;
p->next = s;
return true;
}
//前插操作
bool InsertPriorNode(ListNode* p, int value) {
//前插操作
if (p == NULL) {
return false;
}
ListNode* s = new ListNode(value);
s->next = p->next;
p->next = s;
//赋值(偷天换日)
s->val = p->val;
p->val = value;
return true;
}
//按值查找结点
ListNode* GetValue(ListNode* head,int value) {
ListNode* p = head;
while (p != NULL && p->val != value) {
p = p->next;
}
return p;
}
//按位序查找结点
ListNode* GetElem(ListNode* head, int value){
int j = 0;
if (value < 0) {
return NULL;
}
ListNode* p = head;
while (p != NULL && j < value) {
p = p->next;
j++;
}
return p;
}
//链表长度
int length(ListNode* head) {
ListNode* p = head;
int ans = 0;
while (p != NULL) {
p = p->next;
ans++;
}
return ans;
}
//按位删除结点
bool DeleteNodeToNum(ListNode* head, int i) {
if (i < 1) {
return false;
}
ListNode* p=head;
int j = 0;
while (p != NULL && j < i - 1) {
p = p->next;
j++;
}//找到第i-1个节点
if (p == NULL) {
return false;
}
ListNode* q = p->next;
p->next = q->next;
return true;
}
双链表
创建链表
typedef struct DListNode {
int val;
DListNode* prior;
DListNode* next;
DListNode(int a) : val(a),prior(NULL), next(NULL) {}
//构造函数
};
双链表的插入
//双链表插入
DListNode* InsertNextNode(DListNode *p, int value) {
//将s插在p之后
if (p == NULL ) {
return NULL;
}
DListNode* s = new DListNode(value);
s->next = p->next;
if (p->next != NULL) {//防止后节点为空
p->next->prior = s;
}
s->prior = p;
p->next = s;
p = p->next;
return p;
}
双链表的删除结点
//删除p的后继节点
bool DeleteNextDNode(DListNode* p) {
if (p == NULL) {
return false;
}
DListNode* q = p->next;//q为p的后继结点
p->next = q->next;
if (q->next != NULL) {
q->next->prior = p;
}
return true;
}
void DeleteNumNode(DListNode* head, int i) {//删除指定序号结点
int j = 0;
DListNode* p = head, * q; //将s变为q
while (j < i - 1 && p != NULL) { //查找第i-1个节点i
j++;
p = p->next;
}
if (p == NULL) { //不存在第i-1个节点
return ;
}
else {
q = p->next; //q指向要删除的节点
if (q == NULL) return ; //这里要判断是否存在第i个节点
p->next = q->next;
if (p->next != NULL) p->next->prior = p;
}
}
计算长度
//计算长度
int Length(DListNode* head) {
int t = 0;
while (head != NULL) {
t++;
head = head->next;
}
return t;
}
以上就是单链表和双链表的基本操作
希望对大家有所帮助