今天课间的时候偶然看到了一个面试题:单链表的逆置,看了题解感觉乖乖的,貌似和以前看的版本不搭,于是重新进行了一番探究
单链表的逆置分为两种方法:头插法和就地逆置法,这两种方法虽然都能够达到逆置的效果,但还是有着不小的差别
头插法
算法思路:依次取原链表中的每一个节点,将其作为第一个节点插入到新链表中,指针用来指向当前节点,p为空时结束。
核心代码
void reverse(node*head) { node*p; p=head->next; head->next=NULL; while(p) { q=p; p=p->next; q->next=head->next; head->next=q; } }
以上面图为例子,说白了就是不断的将1后面的节点插入到head后面,即为头插法
完整代码
#include<stdio.h> #include<malloc.h> typedef struct node { int data; struct node*next; }node; node*creat() { node*head,*p,*q; char ch; head=(node*)malloc(sizeof(node)); q=head; ch='*'; puts("单链表尾插法,?结束"); while(ch!='?') { int a; scanf("%d",&a); p=(node*)malloc(sizeof(node)); p->data=a; q->next=p; q=p; ch=getchar(); } q->next=NULL; return(head); } void print(node*a) { puts("print "); a=a->next; while(a!=NULL) { printf("%d ",a->data); a=a->next; } } void reverse(node*head) { node*p,*q; p=head->next; head->next=NULL; while(p) { q=p; p=p->next; q->next=head->next; head->next=q; } } main() { node*a; a=creat(); print(a); reverse(a); puts("\nhaved reversed:"); print(a); return 0; }