代码实现
struct ListNode* swapPairs(struct ListNode* head) {
typedef struct ListNode ListNode;
ListNode *fakehead = (ListNode*)malloc(sizeof(ListNode));
fakehead->next = head;
ListNode* left = fakehead;
ListNode* right = fakehead->next;
while(left && right && right->next)
{
left->next = right->next;
right->next = left->next->next;
left->next->next = right;
left = right;
right = left->next;
}
return fakehead->next;
}
代码实现
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* removeNthFromEnd(struct ListNode* head, int n) {
typedef struct ListNode ListNode;
ListNode* fakehead=(ListNode*)malloc(sizeof(ListNode));
fakehead->next = head;
ListNode* fast = fakehead;
ListNode* slow = fakehead;
int count = 0;
for(;count < n+1; count++){
fast = fast->next;
}
while(fast){
fast = fast->next;
slow = slow->next;
}
ListNode* temp;
temp = slow->next;
slow ->next = slow->next->next;
free(temp);
return fakehead->next;
}
思考:
为什么要对齐链表长度后才进行比较,相差的那一段为什么不会有相同的
——因为他们有一段共同的长度,所以说,他们相差的那一段中不可能有相同的元素。
代码实现
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
strzuct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
struct ListNode *l = NULL, *s = NULL;
int lenA = 0, lenB = 0, gap = 0;
// 求出两个链表的长度
s = headA;
while (s) {
lenA ++;
s = s->next;
}
s = headB;
while (s) {
lenB ++;
s = s->next;
}
// 求出两个链表长度差
if (lenA > lenB) {
l = headA, s = headB;
gap = lenA - lenB;
} else {
l = headB, s = headA;
gap = lenB - lenA;
}
// 尾部对齐
while (gap--) l = l->next;
// 移动,并检查是否有相同的元素
while (l) {
if (l == s) return l;
l = l->next, s = s->next;
}
return NULL;
}
代码实现
ListNode *detectCycle(ListNode *head) {
ListNode *fast = head, *slow = head;
while (fast && fast->next) {
// 这里判断两个指针是否相等,所以移位操作放在前面
slow = slow->next;
fast = fast->next->next;
if (slow == fast) { // 相交,开始找环形入口:分别从头部和从交点出发,找到相遇的点就是环形入口
ListNode *f = fast, *h = head;
while (f != h) f = f->next, h = h->next;
return h;
}
}
return NULL;
}
本文介绍了四个与链表相关的编程问题:两两交换链表节点、删除链表倒数第N个节点、找出两个链表的交点以及检测环形链表。作者提供了C++代码实现,展示了如何有效地处理这些问题。

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



