问题描述 : 给出一个单链表的头节点,反转改链表
思路: 1、在原链表上做改动,由于是单链表,所以在将B指向前一个A节点后,链表会出现断裂的情况,导致我们之后就无法遍历到节点C,为了避免这种情况,我们要在调整节点B之前,把C节点保存下来。,因此需要定义三个指针。分别指向当前遍历到的节点,它的前一个节点,和后一个节点。
//逆置/反转单链表
ListNode* ReserveList1(ListNode* first)
{
if (first == NULL) {
return NULL;
}
ListNode* p1 = first;
ListNode* p2 = first->next;
ListNode* p3 = p2->next;
while (p2!= NULL) {
p2->next = p1;
p1 = p2;
p2 = p3;
if (p3!= NULL) {
p3 = p3->next;
}
}
return p1;
}
2、不在原联表上做修改,而是把原链表的节点一个一个取下来(并不是真的取),利用头插,再重新组一个新链表
ListNode* ReserveList2(ListNode* first)
{
if (first == NULL) {
return NULL;
}
ListNode* cur = first;
ListNode* node;
ListNode* result = NULL;
while (cur != NULL) {
//把节点摘下来,不是真正的摘
node = cur;
//保存下一个节点
cur = cur->next;
node->next = result;
result = node;
}
return result;
}
//测试
void TestReserveList()
{
ListNode* first = NULL;
ListPushBack(&first, 1);
ListPushBack(&first, 2);
ListPushBack(&first, 3);
ListPushBack(&first, 4);
ListPushBack(&first, 5);
ListPushBack(&first, 6);
printf("原链表:");
ListPrint(&first);
ListNode* sul = ReserveList2(first);
printf("逆置后 :");
ListPrint(&sul);
printf("再次逆置:");
ListNode* sul2 = ReserveList1(sul);
ListPrint(&sul2);
}