目录
题目
解法一:借助栈的特性
typedef struct stack
{
void** arr;
int top;
} stackType;
stackType* stackInit(uint32_t size)
{
stackType* stack = malloc(sizeof(*stack));
stack->arr = malloc(sizeof(*stack->arr) * size);
stack->top = -1;
return stack;
}
void stackPush(stackType* stack, void* val)
{
stack->arr[++stack->top] = val;
}
void* stackPop(stackType* stack)
{
return stack->arr[stack->top--];
}
bool stackEmpty(stackType* stack)
{
return stack->top == -1;
}
int stackSize(stackType* stack)
{
return stack->top + 1;
}
void stackFree(stackType* stack)
{
free(stack->arr);
free(stack);
}
struct ListNode* swap(struct ListNode* head)
{
if (!head)
return head;
stackType* stack = stackInit(2);
struct ListNode* virHead = malloc(sizeof(*virHead));
struct ListNode* curNode = virHead;
struct ListNode* listCurNode = head;
while (listCurNode || !stackEmpty(stack))
{
if (stackSize(stack) < 2 && listCurNode)
{
stackPush(stack, listCurNode);
listCurNode = listCurNode->next;
}
else
while (!stackEmpty(stack))
{
curNode->next = stackPop(stack);
curNode = curNode->next;
}
}
curNode->next = NULL;
stackFree(stack);
struct ListNode* retHead = virHead->next;
free(virHead);
return retHead;
}
struct ListNode* swapPairs(struct ListNode* head)
{
return swap(head);
}
解法二:迭代
struct ListNode* swap(struct ListNode* head)
{
if (!head)
return head;
struct ListNode* virHead = malloc(sizeof(*virHead));
virHead->next = head;
struct ListNode* preNode = virHead;
struct ListNode* firstNode = head;
struct ListNode* secondNode = firstNode->next;
while (firstNode && secondNode)
{
firstNode->next = secondNode->next;
secondNode->next = firstNode;
preNode->next = secondNode;
preNode = firstNode;
firstNode = firstNode->next;
if (firstNode)
secondNode = firstNode->next;
}
struct ListNode* retHead = virHead->next;
free(virHead);
return retHead;
}
struct ListNode* swapPairs(struct ListNode* head)
{
return swap(head);
}
解法三:递归
struct ListNode* swap(struct ListNode* head)
{
if (!head || !head->next)
return head;
struct ListNode* retHead = head->next;
head->next = swap(retHead->next);
retHead->next = head;
return retHead;
}
struct ListNode* swapPairs(struct ListNode* head)
{
return swap(head);
}