链表oj练习

例1

运用前插思想

c 复制代码
struct ListNode* reverseList(struct ListNode* head) {
    struct ListNode*pre=NULL;
    struct ListNode*cur=head;
    struct ListNode*tmp=NULL;
    while(cur)
    {
        tmp=cur->next;
        head=cur;
        cur->next=pre;
        pre=cur;
        cur=tmp;
    }
    return head;
}

例2

c 复制代码
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2)
 {
        struct ListNode* cur1=list1;
        struct ListNode* cur2=list2;
        struct ListNode* new=NULL;
        struct ListNode* newhead=NULL;
        while(cur1&&cur2)
        {
            if(cur1->val<=cur2->val)
            {
                if(newhead==NULL)
                {
                    newhead=cur1;
                    new=cur1;
                }
                else{
                    new->next=cur1;
                    new=cur1;
                }
                cur1=cur1->next;
            }
            else{
                if(newhead==NULL)
                {
                    newhead=cur2;
                    new=cur2;
                }
                else{
                    new->next=cur2;
                    new=cur2;
                }
                cur2=cur2->next;
            }
        }
        if(cur1==0)
            {
                while(cur2)
                {
                    if(newhead==NULL)
                {
                    newhead=cur2;
                    new=cur2;
                }
                else{
                    new->next=cur2;
                    new=cur2;
                }
                cur2=cur2->next;
                }
                
            }
            else
            {
                while(cur1)
                {
                     if(newhead==NULL)
                {
                    newhead=cur1;
                    new=cur1;
                }
                else{
                    new->next=cur1;
                    new=cur1;
                }
                cur1=cur1->next;
                }
                
                
            }
        return newhead;
 }

例子3

c 复制代码
#include<stdio.h>
#include<stdlib.h>
class Partition {
public:
    ListNode* partition(ListNode* pHead, int x) {
        ListNode* lit=NULL;
        ListNode* big=NULL;
        ListNode* cur1=NULL;
        ListNode* cur2=NULL;
        ListNode* cur=pHead;
        while(cur)
        {
            if(cur->val<x)
            {
                if(lit==NULL)
                {
                    lit=cur;
                }
                else
                {
                    cur1->next=cur;
                }
                cur1=cur;
                cur=cur->next;
            }
            else
            {
                if(big==NULL)
                {
                    big=cur;
                }
                else
                {
                    cur2->next=cur;
                }
                cur2=cur;
                cur=cur->next;
            }
        }
        if(lit==NULL)
        return big;
        cur1->next=big;
        if(big==NULL)
        return lit;
        cur2->next=NULL;
        return lit;
    }
};

li4

c 复制代码
bool hasCycle(struct ListNode *head) {
 if(head==0||head->next==0)
    return 0;
 struct ListNode *slow=head;
 struct ListNode *fast=head->next;
 while(slow!=fast&&fast!=0&&fast->next!=0)
 {
    fast=fast->next->next;
    slow=slow->next;
 }      
 if(slow==fast)
 return 1;
 return 0;
}

尾插适合前哨兵

li5

struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) 
{
    struct ListNode *curb=headB;
    struct ListNode *cura=headA;
    int cta=0;
    int ctb=0;
    while(cura)
    {
        cta++;
        cura=cura->next;
    }
    while(curb)
    {
        ctb++;
        curb=curb->next;
    }
    int len=abs(cta-ctb);
    if(cta>=ctb)
    {
        while(len--)
        {
            headA=headA->next;
        }
    }
    else{
        while(len--)
        headB=headB->next;
    }
    while(headB)
    {
        if(headA==headB)
        return headA;
        headA=headA->next;
        headB=headB->next;
    }
    return 0;
}

li6

class PalindromeList {
public:
    bool chkPalindrome(ListNode* A) {
        ListNode*slow,*fast;
        slow=A;
        fast=A;
        while(fast&&fast->next)
        {
            fast=fast->next->next;
            slow=slow->next;
        }
        ListNode*newhead=NULL;
        ListNode*cur=slow;
        ListNode*pre=NULL;
        while(cur)
        {
            newhead=cur;
            cur=cur->next;
            newhead->next=pre;
            pre=newhead;
        }
        while(newhead)
        {
            if(A->val!=newhead->val)
            return 0;
            A=A->next;
            newhead=newhead->next;
        }
        return 1;

    }
};
相关推荐
ChinaRainbowSea3 小时前
MySQL 索引的数据结构(详细说明)
java·数据结构·数据库·后端·mysql
白晨并不是很能熬夜4 小时前
【JVM】字节码指令集
java·开发语言·汇编·jvm·数据结构·后端·javac
*.✧屠苏隐遥(ノ◕ヮ◕)ノ*.✧4 小时前
C语言_数据结构总结7:顺序队列(循环队列)
c语言·开发语言·数据结构·算法·visualstudio·visual studio
橘颂TA4 小时前
每日一练之合并两个有序链表
数据结构·链表
LIUJH12335 小时前
数据结构——单调栈
开发语言·数据结构·c++·算法
shylyly_5 小时前
list的模拟实现
数据结构·c++·链表·迭代器·list·list的模拟实现
ianozo6 小时前
数据结构--【栈与队列】笔记
数据结构·笔记
路飞雪吖~6 小时前
数据结构 && 常见的排序算法
数据结构·算法·排序算法
手握风云-6 小时前
Java数据结构第二十一期:解构排序算法的艺术与科学(三)
数据结构·算法·排序算法
wxr的理想之路7 小时前
list链表的使用
c语言·数据结构·链表·list