不算难的题,按要求建立一个虚拟头结点,再按顺序调换两个结点的前后结点地址就行。
...事实上我第一遍没理解题意,写完才发现是12,34这样的两两互换。
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
ListNode* tmpHead = new ListNode;
tmpHead->next = head;
ListNode* cur = tmpHead;
while(cur->next != nullptr && cur->next->next != nullptr)
{
ListNode* tmp1 = cur->next;
ListNode* tmp2 = cur->next->next->next;
cur->next = cur->next->next;
cur->next->next = tmp1;
cur->next->next->next = tmp2;
cur = cur->next->next;
}
ListNode* result = tmpHead->next;
return result;
}
};
时间复杂度O(n),空间复杂度O(1)
19. 删除链表的倒数第 N 个结点 - 力扣(LeetCode)
暴力直接秒了。
但是看了随想录,要求用一遍循环来完成,就懵逼了。结果是双指针法。双指针真是在线性数据结构里非常好用的办法啊!!
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* dummyHead = new ListNode;
tmpHead->next = head;
ListNode* slow = tmpHead;
ListNode* fast = tmpHead;
while(n-- && fast != NULL)
{
fast = fast->next;
}
fast = fast->next;
while (fast != NULL) {
fast = fast->next;
slow = slow->next;
}
slow->next = slow->next->next;
return dummyHead->next;
}
};
while(n-- && fast != NULL)这个操作真的很巧妙,判断了n的值又让n--了。
时间复杂度O(n),空间复杂度O(1)