代码改变世界

面试题4:单链表的插入与删除

2016-03-27 22:52  Keiven_LY  阅读(776)  评论(0编辑  收藏  举报

单链表pos位置插入结点的算法思路:

  1. 声明一个结点p指向链表的头结点,初始化i从1开始;
  2. 当i < pos时,就遍历链表,让p的指针向后移动,不断指向下一结点,i累加1;
  3. 若到链表末尾p为空,则说明第pos个元素不存在;
  4. 否则査找成功,在系统中生成一个空结点q;
  5. 将数据元素elem賦值给q->data;
  6. 单链表的插入标准语句q->next=p->next; p->next=q;
  7. 返回成功。

 单链表的插入功能函数

/*     在链表的pos位置插入元素elem    */
void InsertNode(Node *head, int pos, int elem)
{
    Node *p = head; //声明一个结点p,指向头结点

    int i = 1;

    while(p && i < pos)   //寻找插入的位置
    {
        p = p->next ;
        ++i;
    }

    if(!p || i > pos)
    {
        cout << "要插入的位置不存在" << endl;
    }

    Node *q = (Node *)malloc(sizeof(Node));
    q->data = elem;
    q->next = p->next;
    p->next = q;
}

单链表删除pos位置的结点的算法思路:

  1. 声明一个结点p指向链表第一个结点,初始化i从1开始;
  2. 当i<pos时,就遍历链表,让p的指针向后移动,不断指向下一个结点,i累加 1;
  3. 若到链表末尾p为空,则说明第pos个元素不存在;
  4. 否则査找成功,将欲删除的结点p->next賦给q;
  5. 单链表的删除标准语句p->next=q->next;
  6. 释放q结点;
  7. 返回成功。

单链表的删除功能函数

/*     删除链表pos位置的元素    */
void DeleteNode(Node *head, int pos)
{
    Node *p = head; //声明一个结点p,指向头结点

    int i = 1;

    while(p->next && i < pos)   //寻找插入的位置
    {
        p = p->next;
        ++i;
    }

    if(!(p->next) || i > pos)
    {
        cout << "要删除的位置不存在" << endl;
    }
    Node *q = p->next;
    p->next = q->next;
    free(q);  // 让系统回收此结点,释放内存 
}

完整的可执行程序:

#include<iostream>
#include<stdlib.h> 
#include<time.h>

using namespace std;

typedef struct node
{
    int data;
    struct node *next;
}Node;

Node *CreateListHead(int n) //创建含有n个结点的单链表
{
    Node *head;
    head=(Node *)malloc(sizeof(Node)); /*创建头结点*/
    Node *q = head;

    /* 初始化随机数种子 */
    srand(time(0));  //srand函数在stdlib.h头文件中,time函数在time.h头文件中

    for(int i=0; i < n; i++)
    {
        Node *p = (Node *)malloc(sizeof(Node));
        p->data = rand()%100+1;  //随机生成100以内的数字 
        p->next = q->next;
        q->next = p;
        q = p;
    }
    q->next = NULL;

    return head;
}

/*     在链表的pos位置插入元素elem    */
void InsertNode(Node *head, int pos, int elem)
{
    Node *p = head; //声明一个结点p,指向头结点

    int i = 1;

    while(p && i < pos)   //寻找插入的位置
    {
        p = p->next ;
        ++i;
    }

    if(!p || i > pos)
    {
        cout << "要插入的位置不存在" << endl;
    }

    Node *q = (Node *)malloc(sizeof(Node));
    q->data = elem;
    q->next = p->next;
    p->next = q;
}

/*     删除链表pos位置的元素    */
void DeleteNode(Node *head, int pos)
{
    Node *p = head; //声明一个结点p,指向头结点

    int i = 1;

    while(p->next && i < pos)   //寻找插入的位置
    {
        p = p->next;
        ++i;
    }

    if(!(p->next) || i > pos)
    {
        cout << "要删除的位置不存在" << endl;
    }
    Node *q = p->next;
    p->next = q->next;
    free(q);  // 让系统回收此结点,释放内存 
}

/****打印单链表******/
void print(Node *head)
{
    Node *p;
    if(head->next==NULL)
    {
        cout << "The LinkList is Empty !" <<endl;
        return;
    }
    p=head->next;
    while(p!=NULL)
    {
        cout << p->data << " " ;
        p=p->next;
    }
}
int main()
{
    Node *SingleLinkList = NULL;
    int length;

    cout << "Please input the length of LinkList: " <<endl;
    cin >> length;
    SingleLinkList = CreateListHead(length);
    cout << "The new created LinkList as below: " <<endl;
    print(SingleLinkList);
    cout << endl;

    int position_insert, position_delete;
    int data;

    cout << "请输入要插入的元素及其插入位置: " <<endl;
    cin >> data >> position_insert;
    InsertNode(SingleLinkList, position_insert, data);
    cout << "插入新元素后的链表如下: " <<endl;
    print(SingleLinkList);
    cout << endl;

    cout << "请输入要删除元素的位置: " <<endl;
    cin >> position_delete;
    DeleteNode(SingleLinkList, position_delete);
    cout << "删除" << position_delete <<"位置的元素后,链表如下: " <<endl;
    print(SingleLinkList);
    cout << endl;

    system("pause");
    return 0;

}

运行结果: