- 博客(6)
- 收藏
- 关注
原创 回文链表
把链表里的数存入数组 因为数组的定位十分容易,所以把链表里的数依次存入数组中,从数组的第一个数和最后一个数开始,由两头向中间进发,依次比较 bool isPalindrome(struct ListNode* head){ if(!head||!head->next) return true; int a[999999]={0},i=0,j; struct ListNode *p=head; while(p)//把数据存入数组 { a[i++]=p->val; p=p->
2020-11-29 20:12:43
90
原创 反转链表
反转一个单链表 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 思路 设置一个守卫节点,首先用一个节点记录下初始链表的最后一个节点,每一次循环都把守卫后面的节点插入这个节点的后面 struct ListNode* reverseList(struct ListNode* head){ if(head==NULL||head->next==NULL) return head;//考虑空链表或只
2020-11-15 18:15:43
73
原创 环形链表
给定一个链表,判断链表中是否有环。 链表中有一个环,其尾部连接到第二个节点。 输入:head = [3,2,0,-4], pos = 1 输出:true 思路 本方法需要对「Floyd 判圈算法」(又称龟兔赛跑算法)有所了解。 设置一个快指针,一个慢指针,连个指针一块往后走,如果有环,快指针一定会先进入环,然后一直在环里移动,慢指针后面进来的时候,一定会和快指针在环内相遇。 如果没有环,快指针就会先到达尾结点。 bool hasCycle(struct ListNode *head) { if(h
2020-11-15 17:06:54
61
原创 移除链表元素
删除链表中等于给定值 val 的所有节点。 输入: 1->2->6->3->4->5->6, val = 6 输出: 1->2->3->4->5 删除中间节点和容易,拿一个节点q记录p-next,p=p->next,释放q; 麻烦的是如果第一个节点就是要删除的情况。 先放正确的 struct ListNode* removeElements(struct ListNode* head, int val){ if(head==NULL)
2020-11-15 16:51:11
70
原创 删除排序链表中的重复元素
给定一个排序链表,删除所有重复的元素,使得每一元素只出现一次。 输入: 1->1->2 输出: 1->2 输入: 1->1->2->3->3 输出: 1->2->3 struct ListNode* deleteDuplicates(struct ListNode* head){ if(head== NULL || head->next == NULL)return head; struct ListNode *p=head; struct
2020-11-15 16:36:05
99
原创 合并两个有序链表
迭代法 创建一个头结点,让t指向头结点 每次循环保证t的指向的下一个节点是两链表的节点相比,值小的那一个节点 struct Lian*MergeTwoList_Two(node *L1,node *L2){ if (!L1) return L2; if (!L2) return L1; struct Lian head = (struct Lian)malloc(sizeof(node)),*t = head; while (L1&&L2){ if (L1->a<=L2->
2020-11-11 21:17:30
46
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人