C++面试笔记--单链表

1、编程实现单链表删除节点。

      解析:如果删除的是头节点,如下图:

则把head指针指向头节点的下一个节点。同时free p1,如下图所示:

如果删除的是中间节点,如下图所示:

则用p2的next指向p1的next同时,free p1 ,如下图所示:

2、编写程序实现单链表的插入。

      解析:单链表的插入,如下图所示:

如果插入在头结点以前,则p0的next指向p1,头节点指向p0,如下图所示:

如果插入中间节点,如下图所示:

则先让p2的next指向p0,再让p0指向p1,如下图所示:

如果插入尾节点,如下图所示:

则先让p1的next指向p0,再让p0指向空,如下图所示:

3、编写实现单链表的逆置。

解析:单链表模型如下图所示:

进行单链表逆置,首先要让p2的next指向p1,如下图所示:

再由p1指向p2,p2指向p3,如下图所示:

让后重复p2的next指向p1,p1指向p2,p2指向p3。

  1 #include<iostream>
  2 using namespace std;
  3 typedef struct Student{
  4     int data;
  5     struct student *next;//结构体重如果没有用typedef定义结构体,那么想要声明一个结构体的变量,就需要加上struct
  6
  7 }node;
  8
  9 node *creat(){
 10     /*① 建立头结点
 11       ② 循环输入节点值,0停止输入,其他则继续输入
 12       ③ 插入一个值,新建一个节点存储该值,赋值操作,指针修改操作
 13         上一个节点的next指向新建立的节点,临时指针指向当前节点方便递增操作
 14       ④ 返回一个头结点,该节点不为空
 15     */
 16     node *head,*p,*s;//头结点,p临时头节点,s为新建立的节点
 17     int x,cycye=1;//输入停止变量
 18     head=(node*)malloc(sizeof(node));//建立头结点
 19     p=head;
 20     while(cycle){
 21         cout<<"请输入链表数据:"<<endl;
 22         cin>>x;
 23         if(x!=0){//当输入不为0,继续输入
 24             s=(node*)malloc(sizeof(node));//S为新建立的节点
 25             s->data=x;
 26             cout<<s->data<<endl;
 27             p->next=s;
 28             p=s;//临时指针递增
 29         }
 30         else{
 31             cycle=0;//停止输入
 32         }
 33         p->next=NULL;//指针指向链表尾端
 34         cout<<"    yyy"<<head->next->data<<endl;
 35         head=head->next;
 36         return (head);
 37     }
 38 }
 39 //打印链表
 40 void print(node *head){
 41     /* ① 该链表为空,不输出。
 42        ② 该链表不为空且不止一个节点:头结点没有值,则从头结点的下一个节点开始输出
 43     */
 44     node *tem_node;//临时节点
 45     tem_node=head;
 46     //这里还要输出链表长度
 47     int length=length(head);
 48     cout<<"该链表长度为:"<<length<<endl;
 49
 50     if(head!=NULL){
 51         tem_node=tem_node->next;//因为该头结点没有值,所以要指向下一个
 52     }
 53     while(tem_node!=NULL){
 54         cout<<"节点值:"<<tem_node->data<<endl;
 55         tem_node=tem_node->next;
 56     }
 57 }
 58 //删除节点
 59 node *remove(node *head,int num){
 60     /*① 删除头结点:把头结点的指针指向下一个节点,再把头结点移除
 61       ② 删除中间节点:前驱节点的next指向删除节点的next
 62     */
 63     node *p1,*p2;
 64     p1=head;
 65     //找到删除位置
 66     while(num!=p1->data &&p1->next!=NULL){//删除的值不为头结点值,并且头结点不为空
 67         p2=p1;//删除节点的上一个节点
 68         p1=p1->next;//找到删除节点
 69     }
 70     if(num==p1->data){//如果存在p1节点,删除
 71         if(p1==head){//删除头结点
 72             head=p1->next;
 73             free(p1);
 74         }
 75         else{
 76             p2->next=p1->next;
 77         }
 78     }
 79     else{
 80         cout<<"不存在值为"<<num<<"的节点!"<<endl;
 81     }
 82     return (head);
 83 }
 84 node *insert(node *head,int num){
 85     /*① 从头部插入:头指针指向插入节点,新插入节点next指向原头结点
 86       ② 从中间插入:插入位置的前一个节点next指向新插入节点,新插入节点nex指向后一个节点
 87       ③ 从尾部插入:和2类似,只是最后是新插入节点next指向NULL
 88     */
 89     node *p1,*p2,*p3;
 90     p2=head;
 91     p1=(node*)malloc(sizeof(node));//新增节点
 92     p1->data=num;
 93     while(p1->data > p2->data && p2->next!=NULL){//找插入点
 94         p3=p2;
 95         p2=p2->next;
 96         //p2是后一个,P3是前一个
 97     }
 98     //判断这个插入的位置
 99     if(p1->data<=p2->data){
100         if(head==p2){//从头结点插入
101             p1->next=p2;
102             head=p1;
103         }
104         else {//从中间节点插入
105             p3->next=p1;
106             p1->next=p2;
107         }
108     }
109     else{//没有比他大的数,从尾部插入
110         p2->next=p1;
111         p1->next=NULL;
112     }
113     return (head);
114 }
115 //链表排序
116 node *sort(node *head){
117     /*冒泡排序法解决*/
118     node *p,*p2,*p3;
119     int n;
120     int temp;
121     n=length(head);
122     if(head==NULL ||head->next==NULL)//如果只有一个或者没有节点
123         return head;
124     p=head;
125     for(int j=1;j<n;++j)    {
126         p=head;
127         for(int i=0;i<n-j;++i)        {
128             if(p->data > p->next->data){
129                 temp=p->data;
130                 p->data=p->next->data;
131                 p->next->data=temp;
132             }
133             p=p->next;
134         }
135     }
136         return (head);
137
138 }
139 //链表的转置
140 node *reverse(node *head){
141     /**/
142     node *p1,*p2,*p3;
143     if(head==NULL || head->next==NULL){
144         return head;
145     }
146     p1=head;
147     p2=p1->next;
148     while(p2){
149         p3=p2->next;
150         p2->next=p1;
151         p1=p2;
152         p2=p3;
153     }
154     head->nex=NULL;
155     head=p1;
156     return head;
157 }
158 //链表测长
159 int length(node *head){
160     node *tem_node;
161     tem_node=head;
162     int n=0;
163     while(tem_node!=NULL){
164         n++;
165         tem_node=tem_node->next;
166     }
167     return n;
168 }
169
170 int main(){
171
172 }

时间: 2024-11-12 10:46:42

C++面试笔记--单链表的相关文章

c++学习笔记—单链表基本操作的实现

用c++语言实现的单链表基本操作,包括单链表的创建(包括头插法和尾插法建表).结点的查找.删除.排序.打印输出.逆置.链表销毁等基本操作. IDE:vs2013 具体实现代码如下: [cpp] view plaincopy #include "stdafx.h" #include <malloc.h> #include <iostream> using namespace std; typedef struct Lnode { int data; struct 

C语言实现单链表,单链表面试题面试

单链表是学习不可缺少的一个重要模块,在面试中也会出很多的单链表变种问题,今天就把他们汇总宋总结一下 首先来是实现一个简单的单链表: (在这里,一些简单的实现单链表的操作函数就不备注了) typedef  int DataType;//typedef了一个类型,以后如果想要改变单链表节点内储存数据的类型就可以直接在这里改变 typedef struct SListNode { DataType data;           //数据 struct SListNode* next;  //指向下一

学习笔记:单链表实现多项式相乘(一)

单链表实现多项式相乘,有这样的一个思路可以参考: 实现多项式相乘,最关键的是系数和指数的两个数据,这里命名为coef和HighPower. 最简便的办法是使用两个嵌套循环例如(3x^2+4x^1)(x^2+2x^4)用3x^2遍历另外一个括号内的数据,同时实现本身括号内的遍历. 这个想法的核心程序可归纳为以下: while(pList!=NULL){ while(pList2!=NULL){ pNew=(PNODE)malloc(sizeof(NODE)); pNew->pNext=NULL;

笔试,面试,C/C++,数据结构单链表排序(改进冒泡排序)

void BubbleSortNode(SListNode *&pHead)//单链表排序 {  assert(pHead);  SListNode *tail = NULL;  int Bool = 0;  //若没有进行交换提前返回  while (tail!=pHead->next)  {   Bool = 0;   SListNode *tmp = pHead;   SListNode *tmpnext = tmp->next;   while (tmp->next !=

数据结构笔记5带头结点单链表

/* 本次操作是对带头节点单链表的操作  包括删除  插入 判空 建立  包括删除插入函数  显示函数 目的是为了对单链表做一个基本操作的总结----1*/ #include<stdio.h>#include<malloc.h>#include<conio.h>#define OK 1#define ERROR -1#define OVERFLOW -2#define ENDFLAG 0typedef struct LNode{ int data; struct LNo

韩顺平_PHP程序员玩转算法公开课(第一季)02_单链表在内存中存在形式剖析_学习笔记_源代码图解_PPT文档整理

文西马龙:http://blog.csdn.net/wenximalong/链表——最灵活的数据结构链表用来解决复杂的问题和算法是很方便的. 内容介绍1.什么是链表2.单向链表3.双向链表4.环形链表5.使用环形链表解决约瑟夫问题 链表——什么是链表链表是有序的列表,但是它在内存中是分散存储的. 链表无处不在,比如在操作系统中,文件和文件之间,文件块和文件块之间,是靠链表链接起来的.使用链表可以解决类似约瑟夫问题,排序,索引,二叉树,广义表... 链表——单链表的快速入门使用head头的单向链表

STL源码笔记(16)—单链表slist

STL单链表slist简介 概述 slist(Single linked list)顾名思义,是一个单向链表,这个容器并不在标准规格之内,在我几年的代码学习生涯中也是第一次听说,既然侯老师的书中提到了,那也还是学习一蛤. slist与list的主要差别是,前者的迭代器属于单向的Forward Iterator(可读写),后者的迭代器属于双向的Bidirectional Iterator(可以双向读写).看起来slist的功能应该会不如list,但由于其单向链表的实现,其消耗的空间更小,某些操作更

面试之路(10)-BAT面试之java实现单链表的插入和删除

链表的结构: 链表在空间是不连续的,包括: 数据域(用于存储数据) 指针域(用于存储下一个node的指针) 单项链表的代码实现: 节点类 构造函数 数据域的get,set方法 指针域的get,set方法 代码: public class Node { Object element; //数据域 Node next; //指针域 //构造方法 public Node(Object obj, Node nextval) { this.element = obj; this.next = nextva

[程序员代码面试指南]链表问题-单链表的选择排序(选择排序)

题意 给定一个无序单链表的头节点head,实现单链表的选择排序. 题解 按选择排序方法:每次从原链表找出最小值,从原链表删除,插入新的有序链表. 时间复杂度O(n^2) 额外空间复杂度O(1) 代码 public class Main { public static void main(String args[]) { Node n1=new Node(2); Node n2=new Node(1); Node n3=new Node(3); n1.next=n2; n2.next=n3; No