链表相关OJ题 (一)

目录

1、反转链表

 2、链表的中间结点

3、链表中倒数第k个结点

 4、合并两个有序链表


1、反转链表

题目介绍:

 

 题目链接:206. 反转链表 - 力扣(LeetCode) (leetcode-cn.com)

我们可以从链表的头到尾依次将每个节点尾插到另一个节点,来实现反转。

首先定义一个新的指针phead,并且将其置空。 随后 next=cur->next, cur->next=phead,phead=cur,cur=next.

代码实现如下:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


struct ListNode* reverseList(struct ListNode* head)
{
   if(head==NULL)
   {
       return NULL;
   }
   struct ListNode* cur=head;
   struct ListNode* phead=NULL;
   while(cur)
   {
       struct ListNode*next=cur->next;
       cur->next=phead;
       phead=cur;
       cur=next;
   }
   return phead;
}

 2、链表的中间结点

题目介绍:

 题目链接:876. 链表的中间结点 - 力扣(LeetCode) (leetcode-cn.com)

 这里我们定义两个快慢指针,快指针走两步,慢指针走一步。

若链表中的数据为奇数:

 若链表中的数据为偶数:

 综上所述代码如下:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


struct ListNode* middleNode(struct ListNode* head)
{
  struct ListNode* slow=head;
  struct ListNode* fast=head;
  while(fast!=NULL&&fast->next)
  {
      fast=fast->next->next;
      slow=slow->next;
  }
  return slow;
}

3、链表中倒数第k个结点

题目介绍:

 题目链接:链表中倒数第k个结点_牛客题霸_牛客网 (nowcoder.com)

这里我们同第二题一样定义两个快慢指针来解决这个问题。先让fast走k步,然后让fast与slow同时向后遍历,如果fast==NULL,slow就是倒数第k个结点啦。

 代码如下:

/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 * };
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 */

/**
 * 
 * @param pListHead ListNode类 
 * @param k int整型 
 * @return ListNode类
 */
struct ListNode* FindKthToTail(struct ListNode* pListHead, int k )
{
    struct ListNode* fast=pListHead;
    struct ListNode* slow=pListHead;
    while(k--)
    {
        if(fast)
        fast=fast->next;
        else
            return NULL;
    }
    while(fast!=NULL)
    {
        fast=fast->next;
        slow=slow->next;
    }
    return slow;
    
}

 4、合并两个有序链表

题目介绍:

 题目链接:21. 合并两个有序链表 - 力扣(LeetCode) (leetcode-cn.com)

我们这里利用归并的思想来做这道题,如果还不了解归并排序的老铁们可以看我之前的文章,我之前的文章中有归并排序的讲解!

首先利用依次比较list1->val 和 list2->val  将小的那一边放入一个新的链表里面!

然后list1与list2 依次往后遍历,直到结束。

 代码如下:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2)
{
    struct ListNode* head=NULL;
    struct ListNode* tail=NULL;
    if(list1==NULL)
    return list2;
    if(list2==NULL)
    return list1;
    while(list1&&list2)
    {
        if(list1->val<list2->val)
        {
            if(head==NULL)
            {
                head=tail=list1;
            }
            else
            {
                tail->next=list1;
                tail=list1;
            }
            list1=list1->next;
        }
        else 
        {
            if(head==NULL)
            {
                head=tail=list2;
            }
            else
            {
                tail->next=list2;
                tail=list2;
            }
            list2=list2->next;
        }
    }
    if(list1)
    {
        tail->next=list1;
    }
    if(list2)
    {
        tail->next=list2;
    }
    return head;
}

猜你喜欢

转载自blog.csdn.net/m0_57249790/article/details/124089007
今日推荐