1. 题目链接: 24. 两两交换链表中的节点
个人题解如下:迭代解法!
class Solution
{
public:
ListNode* swapPairs(ListNode* head)
{
ListNode * dummyHead = new ListNode(0);
dummyHead->next = head;
ListNode * temp = dummyHead;
while ((temp->next != NULL) && (temp->next->next != NULL))
{
ListNode * node1 = temp->next;
ListNode * node2 = temp->next->next;
temp->next = node2;
node1->next = node2->next;
node2->next = node1;
temp = node1;
}
return dummyHead->next;
}
};
2. 题目链接: 19.删除链表的倒数第N个节点
个人题解如下:双指针法,再在前面添加一个dummy节点,first指针先往前走n步,然后first和second一起往前走,直接first到NULL,此时second就是待删除点的前一个节点。

class Solution
{
public:
ListNode* removeNthFromEnd(ListNode* head, int n)
{
ListNode * dummy = new ListNode(0, head);
ListNode * first = head;
ListNode * second = dummy;
for (int i = 0; i < n; i ++)
{
first = first->next;
}
while (first)
{
first = first->next;
second = second->next;
}
second->next = second->next->next;
ListNode* ans = dummy->next;
delete dummy;
return ans;
}
};
3. 题目链接: 160.链表相交
个人题解如下:先过遍历headA、headB, 然后让尾部对齐,然后一起往前移,直到相等。
class Solution
{
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB)
{
int len_A = 0;
int len_B = 0;
ListNode * cur_A;
ListNode * cur_B;
cur_A = headA;
while (cur_A != NULL)
{
len_A ++;
cur_A = cur_A->next;
}
cur_B = headB;
while (cur_B != NULL)
{
len_B ++;
cur_B = cur_B->next;
}
cur_A = headA;
cur_B = headB;
if (len_A > len_B)
{
while (len_A > len_B)
{
cur_A = cur_A->next;
len_A --;
}
}
else if (len_A < len_B)
{
while (len_A < len_B)
{
cur_B = cur_B->next;
len_B --;
}
}
while ((cur_A != NULL) && (cur_B != NULL))
{
if (cur_A == cur_B)
{
return cur_A;
}
cur_A = cur_A->next;
cur_B = cur_B->next;
}
return NULL;
}
};
4. 题目链接: 142.环形链表II
个人题解如下:快慢指针法,快走两步,慢走一步,先判断会不会碰在一起。若碰在一起,慢指针回退到head, 快慢指针同时望前走一步,直到碰面。
class Solution
{
public:
ListNode *detectCycle(ListNode *head)
{
ListNode* low = head;
ListNode* fast = head;
int find = 0;
while (fast != NULL)
{
low = low->next;
fast = (fast == NULL) ? NULL: fast->next;
fast = (fast == NULL) ? NULL: fast->next;
if (low == fast)
{
find = 1;
break;
}
}
if (find != 1)
{
return NULL;
}
low = head;
while ((low != fast) && (low != NULL) && (fast != NULL))
{
low = low->next;
fast = fast->next;
}
return fast;
}
};
本文提供了四道关于链表操作的题目解决方案,包括两两交换链表中的节点、删除链表的倒数第N个节点、找到两个链表的交点以及检测环形链表。解法分别使用了迭代、双指针和快慢指针等技巧。

183

被折叠的 条评论
为什么被折叠?



