反转链表,将单链表倒置输出
这个也算是很多面试题里常考的题,刚复习完单链表在这记录一下这几种方法,做个笔记
//链表反转1 创建一个新的链表,遍历原链表头插到新链表
LinkedList listReverseList(LinkedList L)
{
LinkedList temp = L->next;
LinkedList start = listCreatNode(NULL);//创建一个新的链表
if(start == NULL)
{
perror("listCreatNode err");
return NULL;
}
while(temp)
{
LinkedList node = listCreatNode(temp->data);
if(node == NULL)
{
perror("listCreatNode err");
return NULL;
}
node->next = start->next;
start->next = node;
temp = temp->next;
}
return start;
}
//
int listReverseList2(LinkedList L)
{
/*
* 先让头结点下一跳指向第三个结点,然后让第二个结点指向第四个结点
* 最后让第三个结点的下一跳指向第二个结点
从第二个结点开始,每次循环向后步进一,把这个结点头插到头结点后边
H-->N2-->N3-->N4-->N5
H-->N3-->N2-->N4-->N5
H-->N4-->N3-->N2-->N5
H-->N5-->N4-->N3-->N2
*/
LinkedList temp = L->next; //指向第二个结点
LinkedList p = NULL; //中间变量
while(temp->next) //从第二个结点开始遍历
{
p = temp->next; //指向当前操作结点
temp->next = p->next; //让前一结点下一跳指向后一结点(对操作结点来说)
p->next = L->next; //让操作结点下一跳指向前一结点(头插法)
L->next = p; //头结点的下一跳指向操作结点(操作结点与第二结点互换了)
}
return 0;
}
//
int listReverseList3(LinkedList L)
{
/*
* 让下一个结点指向上一个结点,第一个结点指向NULL
*/
LinkedList temp = L->next; //指向第二个结点
LinkedList p = NULL; //中间变量
LinkedList n = NULL; //新链表终结点
while(temp) //让下一个结点指向上一个结点
{
p = temp->next; //p指向temp的下一个结点
temp->next = n; //下一个指向上一个(第一次时指向NULL,作为终结点)
n = temp; //新链表向后移
temp = p; //
}
L->next = n;
return 0;
}