题目:
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
if(head==nullptr||head->next==nullptr) return head;
ListNode vhead;
vhead.next = head;
ListNode *cur = &vhead;
while(cur->next != nullptr && cur->next->next != nullptr){
ListNode *temp1 = cur->next;
ListNode *temp2 = cur->next->next->next;
cur->next = cur->next->next;
cur->next->next = temp1;
cur->next->next->next = temp2;
cur = cur->next->next;
}
return vhead.next;
}
};
题目:给你一个链表,删除链表的倒数第 n
个结点,并且返回链表的头结点。
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode new_head, *p=&new_head, *one=p, *two=p;
new_head.next = head;
for(int i=0;i<n;i++) {
two = two->next;
}
while(two->next){
one = one->next;
two = two->next;
}
ListNode *temp = one->next;
one->next = one->next->next;
delete temp;
return new_head.next;
}
使用双指针,等间隔同时移动,找出要删除节点的前一个节点的指针,再进行删除。使用虚拟头节点,遍历更方便。如要删除倒数第n个节点,让fast移动n步,然后让fast和slow同时移动,直到fast指向链表末尾。删掉slow所指向的节点就可以了
题目:
给你两个单链表的头节点 headA
和 headB
,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null
。
图示两个链表在节点 c1
开始相交:
ListNode* swapPairs(ListNode* head) {
if(head==nullptr||head->next==nullptr) return head;
ListNode vhead;
vhead.next = head;
ListNode *cur = &vhead;
while(cur->next != nullptr && cur->next->next != nullptr){
ListNode *temp1 = cur->next;
ListNode *temp2 = cur->next->next->next;
cur->next = cur->next->next;
cur->next->next = temp1;
cur->next->next->next = temp2;
cur = cur->next->next;
}
return vhead.next;
}
求出两个链表的长度,并求出两个链表长度的差值,然后让curA移动到,和curB 末尾对齐的位置,比较curA和curB是否相同,如果不相同,同时向后移动curA和curB,如果遇到curA == curB,则找到交点。否则循环退出返回空指针。
给定一个链表的头节点 head
,返回链表开始入环的第一个节点。 如果链表无环,则返回 null
。
如果链表中有某个节点,可以通过连续跟踪 next
指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos
来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos
是 -1
,则在该链表中没有环。注意:pos
不作为参数进行传递,仅仅是为了标识链表的实际情况。
不允许修改 链表。
ListNode *detectCycle(ListNode *head) {
ListNode *slow=head, *fast=head;
while(fast&&fast->next){
fast = fast->next->next;
slow = slow->next;
if(fast==slow){
//快慢指针能相遇,说明有环,开始找起点
fast = head;
while(fast!=slow) fast=fast->next,slow=slow->next;
return fast;
}
}
return nullptr;
}