目录
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;
}