这是一道简单的算法题。
题目如下:
单链表,反转前:
node_1 -> node_2 -> node_3 -> node_4 -> node_5,其中指针pHead指向头节点node_1
反转后:
node_5 -> node_4 -> node_3 -> node_2 -> node_1,其中指针pHead指向头节点node_5
关键点:
共计使用3个指针完成反转,除头节点指针pHead外,创建2个指针p1,p2,
p1作用:指向未参与反转的下一个节点,确保后续链表不会丢失
p2作用:指向当前正参与反转的节点,将其next指针指向前一个节点
代码实现如下:
// 定义单链表节点
Struct {
int key; // 节点存储的值
Node *next; // 指向下一个节点
} Node;
void reverse(Node *pHead) {
if (null == pHead) {
return;
}
Node *p1 = pHead->next;
pHead->next = null; // 此时的头节点将作为单链表最后一个节点,所以指向为null
Node *p2 = p1;
while (null != p1->next) {
p1 = p1->next; // p1指向下一个节点,不参与此轮循环内的反转
p2->next = pHead; // p2反转当前节点,指向上一节点
pHead = p2; // pHead指向新的单链表头节点
p2 = p1; // p2指向p1,此节点将参与下轮循环的反转
}
}
作者:kevin song,2018.11.25于南京建邺区