</pre><p>head代表第一个指针,前面加了一个dummy节点,方面用来处理头指针。</p><p><pre name="code" class="cpp">#include <iostream>
using namespace std;
struct LinkNode{
int data;
LinkNode *next;
LinkNode(int x):data(x),next(NULL){}
};
//创建只有空链表,返回一个dummy节点
LinkNode * createLink()
{
LinkNode *dummy = new LinkNode(-1);
return dummy;
}
LinkNode * initLink(LinkNode *dummy)
{
//用一个数组初始化链表
int array[] = {1,2,3,4,5,6};
LinkNode *tmp,*head;
tmp = dummy;
//使用的是尾插入法
for(int i=0;i<sizeof(array)/sizeof(int);i++)
{
LinkNode *p = new LinkNode(array[i]);
tmp->next=p;
tmp = tmp->next;
}
head = dummy->next;
delete dummy;
return head;
}
//显示链表
void showList(LinkNode *head)
{
while(head)
{
printf("%d ",head->data);
head = head->next;
}
printf("\n");
return;
}
//找值为x的前驱
LinkNode * findPrevious(LinkNode *head,int x)
{
if(head->data == x)
return NULL;
LinkNode *p = head;
while(p->next != NULL && p->next->data != x)
p = p->next;
if(p->next == NULL)
return NULL;
else
return p;
}
//在某个节点后,增加一个新的节点
void addNewNodeAfter(LinkNode *insertPos,int x)
{
LinkNode *p = new LinkNode(x);
p->next = insertPos->next;
insertPos->next = p;
return;
}
//在某个节点insertPos前插入一个新的节点
LinkNode* addNewNodeBefore(LinkNode *head,int insertPos,int x)
{
LinkNode *dummy = new LinkNode(-1);
dummy->next = head;
LinkNode *pre = dummy;
while(pre->next!=NULL && pre->next->data!=insertPos)
pre = pre->next;
if(pre->next == NULL)//找不到insertPos对应的节点
return head;
LinkNode *p = new LinkNode(x);
p->next = pre->next;
pre->next = p;
head = dummy->next;
delete dummy;
return head;
}
//在第K个元素之前,增加一个新的节点
LinkNode * insertKthNode(LinkNode *head,int k,int x)
{
LinkNode *dummy = new LinkNode(-1);
dummy->next = head;
LinkNode *pre = dummy;
//找到前驱元素.需要移动k-1次
for(int i=1;pre->next !=NULL && i<k;i++)
pre = pre->next;
if(pre->next == NULL)//k超过了链表的长度
return head;
LinkNode *p = new LinkNode(x);
p->next = pre->next;
pre->next = p;
head = dummy->next;
delete dummy;
return head;
}
//删除值为x的节点,用dummy节点
LinkNode * deleteNode(LinkNode *head,int x)
{
LinkNode *dummy = new LinkNode(-1);
dummy->next = head;
LinkNode *pre = dummy;
//找到被删除节点的前驱
while(pre->next != NULL && pre->next->data != x)
pre = pre->next;
if(pre->next == NULL) //找不到x对应的节点
return head;
LinkNode *cur = pre->next;
pre->next = cur->next;
delete cur;
head = dummy->next;
delete dummy;
return head;
}
//删除值为x的节点,不用dummy节点
LinkNode* deleteNode2(LinkNode *head,int x)
{
if(head->data == x)
{
//如果是头结点,新增一个dummy节点
LinkNode *dummy = new LinkNode(-1);
dummy->next = head;
LinkNode *newHead = head->next;
dummy->next = newHead;
delete head;
return newHead;
}
//找到x的前驱
LinkNode *pre = findPrevious(head,x);
if(NULL == pre) return head;
LinkNode *p = pre->next;
pre->next = p->next;
delete p;
return head;
}
//reverse 一个链表
LinkNode *reverse(LinkNode *head)
{
LinkNode *pre = NULL;
while(head)
{
LinkNode *tmp = head->next;
head->next = pre;
pre = head;
head = tmp;
}
return pre;
}
//摧毁链表
void desroyList(LinkNode *head)
{
while(head)
{
LinkNode *tmp = head->next;
delete head;
head = tmp;
}
return;
}
void main()
{
//创建一个空链表
LinkNode *dummy = createLink();
//对链表初始化,返回head
LinkNode *head = initLink(dummy);
//显示链表
showList(head);
//找前驱
LinkNode *p = findPrevious(head,3);
printf("%d\n",p->data);
//在某个节点insertPos前插入一个新的节点
addNewNodeBefore(head,3,100);
showList(head);
//在第K个元素前加入一个新的节点
head = insertKthNode(head,1,101);
showList(head);
//删除值为x节点
head = deleteNode(head,1);
showList(head);
//reverse 链表
LinkNode *head_reverse = reverse(head);
showList(head_reverse);
//销毁链表
desroyList(head_reverse);
}
修改前的。
</pre><pre code_snippet_id="601534" snippet_file_name="blog_20150210_1_3771789" name="code" class="cpp">
#include <iostream>
using namespace std;
struct Node
{
int data;
struct Node *Next;
};
//创建只有头结点的空链表
struct Node * createList()
{
struct Node * head = NULL;
head = (struct Node*)malloc(sizeof(struct Node));
if(NULL == head)
{
printf("Create fail!\n");
return NULL;
}
head->Next = NULL;
head->data = -1;
return head;
}
//头插法建立链表
bool insertFromHead(struct Node * head,int x)
{
struct Node * p = NULL;
p = (struct Node *)malloc(sizeof(struct Node));
if (NULL == p)
{
printf("Malloc fail!\n");
return false;
}
p->data = x;
p->Next = head->Next;
head->Next = p;
return true;
}
//尾插法建立链表
bool insertFromTail(struct Node * head,int x)
{
struct Node * tmp = head;
struct Node * p = NULL;
p = (struct Node *)malloc(sizeof(struct Node));
if(NULL == p)
{
printf("malloc fail!\n");
return false;
}
//找到目前的最后一个结点,将新元素插到后面
while(tmp->Next)
tmp = tmp->Next;
p->data = x;
p->Next = NULL;
tmp->Next = p;
return true;
}
//增加一个结点,在insertPos后面添加一个结点
bool addNewNodeAfter(struct Node * head,struct Node * insertPos,int x)
{
struct Node * p = (struct Node *)malloc(sizeof(struct Node));
if(NULL == p)
{
printf("malloc fail\n");
return false;
}
p->Next = insertPos->Next;
p->data = x;
insertPos->Next = p;
return true;
}
//查找含有值为x的前驱p.如果存在多个x的值,我们返回第一个。
struct Node * findPrevious(struct Node * head,int x)
{
struct Node * p = head;
while(p->Next!=NULL && p->Next->data!= x)
p = p->Next;
if(NULL == p->Next)
{
printf("The value %d is not exist in this list!\n",x);
return NULL;
}
else
return p;
}
//在对应元素insertPos的前面,增加一个结点
bool insertNewNodeBefore(struct Node * head,int insertPos,int x)
{
struct Node * pre = findPrevious(head,insertPos);
if (NULL == pre)
{
printf("No record find!");
return false;
}
struct Node *p = (struct Node *)malloc(sizeof(struct Node));
if (NULL == p)
{
printf("malloc failed!");
return false;
}
p->Next = pre->Next;
p->data = x;
pre->Next = p;
return true;
}
//在第k个元素之前,增加一个结点
void insertNodeKth(struct Node * head,int k,int x)
{
struct Node *pre = head;
for(int i = 1;pre->Next!=NULL && i < k;i++)
pre = pre->Next;//找到前驱结点
struct Node *p = (struct Node *)malloc(sizeof(struct Node));
if(NULL==p)
{
printf("malloc failed");
return;
}
p->Next = pre->Next;
p->data = x;
pre->Next = p;
return;
}
//在第K个元素后面,插入一个值
void insertKthAfter(struct Node *head,int k,int x)
{
struct Node *cur = head->Next;
for(int i = 1;cur->Next!=NULL && i < k;i++)
cur=cur->Next;
struct Node *p = (struct Node *)malloc(sizeof(struct Node));
if(NULL==p)
{
printf("malloc failed");
return;
}
p->Next = cur->Next;
p->data = x;
cur->Next = p;
}
//删除值为x的结点
void deleteNode(struct Node * head,int x)
{
struct Node *pre = findPrevious(head,x);
if (NULL == pre)
return;
struct Node *p = pre->Next;
pre->Next = p->Next;
free(p);
return;
}
//reversse.遍历原来的链表节点,用头插法重新生成一个新的链表
struct Node * generateRerverse(struct Node *head)
{
struct Node *head_reverse,*tmp,*p;
head_reverse = (struct Node *)malloc((sizeof(struct Node)));
if(NULL == head_reverse)
{
printf("Malloc fail\n");
return NULL;
}
head_reverse->Next = NULL;
head_reverse->data = 0;
tmp = head->Next;
while(tmp!=NULL)
{
p = (struct Node *)malloc(sizeof(struct Node));
if(NULL == p)
{
printf("Malooc fail\n");
return NULL;
}
p->data = tmp->data;
p->Next = head_reverse->Next;
head_reverse->Next = p;
tmp = tmp->Next;
}
return head_reverse;
}
//将这个链表翻转,不产生新的链表
struct Node * reverseCurLinkList(struct Node *head)
{
struct Node *first,*last,*cur,*post,*tmp;
cur = head->Next;
post = cur->Next;
first = cur;
while(post!=NULL)
{
tmp = post->Next;
post->Next = cur;//将cur和post的指向翻转
cur = post;//cur和post分别向后移动一个
post = tmp;
}
last = cur;
first->Next = NULL;//原来第一个节点,现在在末尾
head->Next = last;//原来最后一个节点,现在位于第一个
return head;
}
//显示链表
bool showList(struct Node * head)
{
struct Node * tmp = head->Next;
if(NULL == tmp)
printf("The list is NULL");
while(tmp)
{
printf("%d ",tmp->data);
tmp = tmp->Next;
}
printf("\n");
return true;
}
//摧毁链表
void deleteList(struct Node * head)
{
struct Node *p,*tmp;
p = head->Next;
head->Next = NULL;
while(p)
{
tmp = p->Next;
free(p);
p=tmp;
}
}
void main()
{
struct Node * pre = NULL;
struct Node * head = createList();
if(NULL == head)
{
printf("create list fail!\n");
return;
}
//insertFromHead(head,1);
//insertFromHead(head,2);
//insertFromHead(head,3);
insertFromTail(head,1);
insertFromTail(head,2);
insertFromTail(head,3);
insertFromTail(head,4);
insertFromTail(head,5);
showList(head);
//查找前驱
//pre = findPrevious(head,3);
//if (pre!=NULL)
//printf("The pre value is: %d\n",pre->data);
//在元素i前面,增加一个元素
//insertNewNodeBefore(head,5,10);
//showList(head);
//在第k个元素前,增加一个元素
//insertNodeKth(head,1,100);
//showList(head);
//在第K个元素后面,增加一个元素
//insertKthAfter(head,1,99);
//showList(head);
//产生一个全新的翻转链表
//struct Node *head_reverse = generateRerverse(head);
//showList(head_reverse);
//将当前的链表翻转,不产生新的链表
head = reverseCurLinkList(head);
showList(head);
//删除值为x的结点
//deleteNode(head,100);
//showList(head);
//销毁List
//deleteList(head);
//showList(head);
return;
}