24.两两交换链表中的节点
题目链接:24. 两两交换链表中的节点 - 力扣(LeetCode)
本题使用虚拟头节点方法
C代码如下:
struct ListNode* swapPairs(struct ListNode* head){
//首先递归的判断条件,头节点不存在或者头节点的下个节点不存在
if(!head || !head->next)
return head;
struct ListNode *newHead = head->next;//创建一个新的节点指针保存头节点的下一个节点
head->next = swapPairs(newHead->next);
newHead->next = head;
return newHead;
}
总结:
本题最有难度的地方是对于节点之间的相互连接能否理清,容易造成困难具体的交换顺序应该是先设置一个虚拟头节点,然后按照2,1,3依次交换。
19.删除链表的倒数第N个节点
题目链接:19. 删除链表的倒数第 N 个结点 - 力扣(LeetCode)
本题是一个经典的双指针问题,还是运用虚拟头节点的方法,首先设置两个指针fast和slow,要让fast先移动n+1个位置,因为这样才能保证slow可以指向要删除节点的上一个节点。
struct ListNode* removeNthFromEnd(struct ListNode* head, int n) {
struct ListNode* dummy = malloc(sizeof(struct ListNode));
dummy->val = 0;
dummy->next = head;
struct ListNode* fast = head;
struct ListNode* slow = dummy;
for(int i= 0; i<n; ++i) {
fast = fast->next;
}
while (fast){
fast=fast->next;
slow=slow->next;
}
slow -> next = slow->next->next;
head = dummy->next;
free(dummy);
return head;
}