链表反转
单向链表的反转是一个经常被问到的一个面试题,也是一个非常基础的问题。比如一个链表是这样的: 1->2->3->4->5 通过反转后成为5->4->3->2->1。最容易想到的方法遍历一遍链表,利用一个辅助指针,存储遍历过程中当前指针指向的下一个元素,然后将当前节点元素的指针反转后,利用已经存储的指针往后面继续遍历。源代码如下:
struct linka {
int data;
linka* next;
};
void reverse(linka*& head)
{
if(head ==NULL)
return;
linka*pre, *cur, *ne;
pre=head;
cur=head->next;
while(cur)
{
ne = cur->next;
#include #include struct LNode//定义单链表结点 { int data;//定一结点的数据域 struct LNode *next;//定义结点的指针域 }; struct LNode *creat();//creat(创建单链表)函数的调用声明 void print (struct LNode *head,char a);//print(打印单链表)函数的调用声明 void main ()//主函数 { struct LNode *head; head = creat();//调用creat函数,创建一个单链表,并将单链表的头指针地址存放在指针 head 中 } struct LNode *creat()//定义指针函数 creat(地址)及创建一个单链表 ,其返回值是一个单链表的首地址 { struct LNode *head,*p,*rear;//定义指针变量 int x; char a; head=(struct LNode *)malloc(sizeof
楼主你好~ 首先你的问题有点小小的误解,头指针意思为指向链表头结点的一个指针,你必须自己定义一个链表结点类型的指针,并指向那个链表的头结点就可以了~何来获取一说,因为本身就是你自己定义的~。 你的问题应该是如何获取单项链表的头结点。常见的解决方案共有以下几种: 1.声明链表后,马上定义一个头指针,指向链表的头结点,这样,不管程序运行到哪儿,都可以通过访问头指针来得到头结点。2.定义单独的头结点,不赋值,永远只作为类似标志的性质,以后通过它访问整个链表,即链表优秀个结点为头结点->Next。3.将单向链表制作为循环链表,在头结点设置特殊值,永远往一个方向找,一旦找到特殊值,即为找到头结点。 请追问~
单向链表单向链表就是通过每个结点的指针指向下一个结点从而链接起来的结构。单向链表的初始化:这里我所讲的链表都是头结点不参与计算的,也就是说优秀个结点都是头结点后面的优秀个结点。所以我要先申明一点,这里我把链表的初始化放在了构造函数部分,然后析构函数负责释放头结点的内存。单向链表的创建过程:链表的创建就是添加结点到链表的最后,开始是添加一个结点到head结点后面,然后添加一个结点到上次添加的结点后面,每次新建的结点的指针总是指向NULL指针。从上面的示意图可以看出,我们需要一个辅助指针一直指向最后一个结点,这个辅助结点就是为了让每次添加的结点都放置在最后一个位置。单向链表插入结点过程:源代码中的的插入结点函数我设置了一个指定位置,就是在指定位置插入结点。首先,通过位置变量position让ptemp结点移动到要插入位置的前一个位置,然后接下来的过程就是和创建链表的过程是一样的,把新建的结点添加到ptemp的后面。这里变量position可以从1到链表长度加1,意思就是如果不算头结点的话有3个结点,那你的position变量就可
看见很好答案回答的那么垃圾,真心伤心,python这个偷懒的编程语言,写的这冗余......#?coding=utf-8nums?=?[1,?2,?3,?4,?5,?6,?7]def?split(nums):????a,?b?=?[],?[]????[a.append(num)?if?nums.index(num)?%?2?else?b.append(num)?for?num?in?nums]????return?a,?bif?__name__?==?'__main__':????a,?b?=?split(nums)????print('偶数角标链表:',?a)????print('奇数角标链表:',?b)
以前学数据结构做过一个“非递减的链表合并一一个非递增的链表”程序如下:#include #include typedef struct node{ int data; struct node *next;}LinkList;/* 建立链表 */LinkList *create_link(int m){ LinkList *head,*s,*p; int i; head=(LinkList *)malloc(sizeof(LinkList)); head->next=NULL; p=head; for(i=0;i
根据我对你的 C 语言源代码的分析,你的源程序中只提供了如下子函数:(1)、计算链表长度:getlen( );(2)、删除链表指定元素:delete( );(3)、在链表中插入一个指定元素:insert( ) ;(4)、遍历整个链表:list( )。而关于到底如何创建一个新链表,你的这个 C 语言源程序代码中并没有写出来。而 C 语言中功能最很强大的、同时并且最最难于调试的代码就是:指针??!而一旦指针再用于对链表的各种操作中(创建、插入、删除、遍历等),如果没有丰富的 C 语言编程经验的话,那要想调试通过一个对链表的各种操作,就更是:难上加难。所以我个人的建议还是:你必须要亲自仔细阅读《数据结构》C语言版的教材,而且最最重要的就是:一定要亲自上机编写、并调试链表程序源代码才行!别人很难于给你马上就写出来一个正确的、可以执行的链表源代码。这就是我当时学习数据结构、以及 C 语言指针的亲身体会。