美文网首页
leetcode 链表类题目选做

leetcode 链表类题目选做

作者: 7daysKILL | 来源:发表于2019-02-20 16:04 被阅读0次

1. Linked list cycle

Diff: Easy


image.png
image.png

思路:空间复杂度为O(1),采用快慢指针,快指针每次走两格,从head->next出发,慢指针每次走一格,从head出发。
循环条件:快慢指针不相遇
特殊情况:输入链表为空时
结束条件:当快指针和慢指针相遇时,return true,代表有环。

这里有人会有疑问,为何快指针和慢指针相遇时,代表链表有环?这个问题可以类比刘翔和你比赛跑步,跑道是环形的,刘翔跑得比你快,一定会在某一时刻套你的圈,所以一定会有相遇的时刻

代码及注释:

C:
bool hasCycle(struct ListNode *head) {
    if(head==NULL||head->next==NULL)  //预防输入的是空链表
       return false;
    struct ListNode *fast = head->next;
    struct ListNode *slow = head;
    while(fast != slow) //循环条件
    {
        if(fast==NULL||fast->next==NULL) //无环链表的尾部是NULL
            return false;
        fast = fast->next->next; //每次移动两格
        slow = slow->next;
        
    }
    return true;
}
java:
public class Solution {
    public boolean hasCycle(ListNode head) {
        if(head==null || head.next==null)
            return false;
        ListNode fast = head.next;
        ListNode slow = head;
        while(fast != slow)
        {
            if(fast==null||fast.next==null)
                return false;
            fast = fast.next.next;
            slow = slow.next;
        }
        return true;
    }
}

2. Swap Nodes in Pairs

Diff: Medium
思路:这里我参考了https://blog.csdn.net/ds19980228/article/details/82759607

因为只有2个结点的情况下,交换次序只需要2个指针,而多于2个结点需要3个指针来进行交换,其中多出来的指针用来告诉此指针后面的结点:“ 我的next指针是你们和上一对的链接,你们要想不中断整条链表,就要和我链接。”

代码:

C:
struct ListNode* swapPairs(struct ListNode* head) {
    if(head==NULL)
        return NULL;
    if(head->next==NULL)
        return head;
    struct ListNode* a=head;
     struct ListNode* b=head->next;
    struct ListNode* tail=NULL;
      a->next = b->next;
      b->next =a;
    head=b;
    tail=a;
    a=a->next;
    if(a==NULL||a->next==NULL)
        return head;
/*以上是只有2个结点的情况,下面是超过2个结点*/
    else{
        while(a&&a->next){
            b=a->next;
            a->next=b->next;
            tail->next=b;
            b->next=a;
            tail=a;
            a=a->next;
        }
    }
    return head;
}
Python:
class Solution(object):
    def swapPairs(self, head):
        pre,pre.next = self,head
        while pre.next and pre.next.next:
            a=pre.next
            b=a.next
            pre.next,b.next,a.next = b,a,b.next
            pre =a
        return self.next;

相关文章

网友评论

      本文标题:leetcode 链表类题目选做

      本文链接:https://www.haomeiwen.com/subject/raxhyqtx.html