两两交换
- 核心思想就是加一个虚拟头结点,然后就可以对于所有节点都进行相同的操作了;
- 设置指针current指向当前结点,初始指向dummyhead,判断结束标志是cur->next == NULL&&cur->neex->next ==NULL(奇数个,则最后一个结点不用交换,偶数个,则最后一个结点的next为空)
- 需要注意的是循环边界问题,操作往后两个结点,需要指针指向第一个结点的前一个结点,所以一开始cur指向dummyhead,最后返回dummyhead->next,即真正头结点,具体代码如下:
typedef struct ListNode {
int val;
struct ListNode* next;
}ListNode;
ListNode* swap(ListNode* head){
ListNode* dummyhead = (ListNode*)malloc(sizeof(ListNode));
dummyhead->next = head;
ListNode* cur = dummyhead;
while(cur->next&&cur->next->next){
ListNode* tmp = cur->next;
ListNode* tmp1 = cur->next->next->next;
cur->next = cur->next->next;
cur->next->next = tmp;
cur->next->next->next = tmp1;
cur = cur->next->next;
}
return dummyhead->next;
}