一下是链表的常见的题型
反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
解法一 头插法:就是用三个指针不断对前三个节点进行链表的头插
struct ListNode* reverseList(struct ListNode* head){
if(head==NULL) {
return head;
}
struct ListNode *p , *next ,* cur;
p = NULL;
cur = head;
next = NULL;
while(cur){
next = cur->next;
cur->next = p;
p = cur;
cur = next;
}
return p;
}
解法二 递归
, Node *newhead = reverseList(head->next); // 获取到反转后的新的头结点,不管具体内容,把整个从head->next看做一个整体
//再将当前节点设置为后面节点的后续节点
head->next->next = head;//将当前head指向的那个节点的下一个节点的下一个节点指向head,就把head和head.next的方向换过来了。
head->next = NULL;//然后把它自己本身的head.next设置为null,就好了。
Node * reverseList(List head) {
//如果链表为空或者链表中只有一个元素
if(head == NULL || head->next == NULL) {
return head;
}
else
{
//先反转后面的链表,走到链表的末端结点
Node *newhead = reverseList(head->next);
//再将当前节点设置为后面节点的后续节点
head->next->next = head;
head->next = NULL;
return newhead;
}
给定一个链表,判断链表中是否有环。
为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。
示例 1:
输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。
示例 2:
输入:head = [1,2], pos = 0
输出:true
解释:链表中有一个环,其尾部连接到第一个节点。
示例 3:
输入:head = [1], pos = -1
输出:false
解释:链表中没有环。
解法快慢指针 设两指针fast slow指向链表头部head,迭代:
fast每轮走两步,slow每轮走一步,这样两指针每轮后距离+1;
若链表中存在环,fast和slow一定会在将来相遇(距离连续+1,没有跳跃);
若fast走到了链表尾部&#