单链表反转

/* 题目: 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表 */ #include #include typedef struct ListNode { int val; struct ListNode *next; }ListNode; //初始化一个单链表 ListNode * link_list_create_from_tail(int *data,int length) { ListNode *head = (ListNode *)malloc(sizeof(ListNode)); if(head == NULL){ printf("申请空间失败"); return NULL; } //初始化链表为空 head->next = NULL; //必须申明一个指向新插入结点的指针,用来标识插入新结点位置 //开始时候p指向head结点 ListNode *p = head; for(int i=0; ival = data[i]; //由于每次插入都是最后一个,所以结点的next指针始终指向NULL node->next = NULL; //前一个结点指针就是p的next指向新结点 p->next = node; //然后把指针指向新结点 p = node; } return head->next; }// 反转单链表 struct ListNode* reverseList(struct ListNode* head){ //前驱指针 struct ListNode *prev = NULL; //遍历用的当前指针 struct ListNode *curr = head; while(curr){ //每次创建新的next指针,指向下一个已经断开的结点 struct ListNode *next = curr->next; //当前指针反向指向前驱结点 curr->next = prev; //后移前驱结点到当前指针位置 prev = curr; //后移当前指针到下一个结点 curr = next; } return prev; }//遍历单向链表 //head: 传入头结点 void print_linkedlist(ListNode * head) { if(head == NULL) { printf("单链表为空"); } //由于头结点不存储数据,故从下一个结点遍历数据 //申明指针p,指向头结点的下一结点 ListNode *p = head; //循环链表,直到指针p为空 while(p) { printf("%d ",p->val); //指针p循环指向下一结点 p = p->next; } }int main(int argc,char *argv[]) { int data1[2] = {1,6}; ListNode *tail1 = link_list_create_from_tail(data1,2); print_linkedlist(tail1); printf("\n"); ListNode *head = reverseList(tail1); print_linkedlist(head); return 0; }

    推荐阅读