文章目录
- 反转链表
- 合并两个有序链表
- 删除重复元素
反转链表
反转链表包括两种,反转全部元素或者反转部分元素。在这里,我们约定:数据元素类型是struct LinkNode
,要反转链表的第一个节点是head,head的前面一个节点是pre,如果head是首节点,则pre等于NULL,要反转链表的最后一个节点的后一个节点是p。
比如说我们要反转的是2,5,4,3,则head节点是2,pre是7,p是6;如果反转的是9,7,2,则head是9,pre是NULL,p是3.
下面函数返回值是反转链表后的首节点,head是要反转链表的首节点,p是要反转链表的最后一个节点的后一个节点。
struct LinkNode *reverse(struct LinkNode *head,struct LinkNode*p)
{struct LinkNode *pre = p;while(head!=p){struct LinkNode *next = head->next;head->next=pre;pre = head;head=next;}return pre;
}
LeedCode 206. 反转链表反转全部元素,反转全部元素最后一个节点的下一个节点是NULL。
struct ListNode* reverse(struct ListNode* head,struct ListNode *p){struct ListNode *pre=p;while(head!=pre &&head!=NULL){struct ListNode *next = head->next;head->next=pre;pre=head;head=next;}return pre;
}struct ListNode* reverseList(struct ListNode* head){return reverse(head,NULL);
}
LeedCode 92. 反转链表 II反转部分链表。
struct ListNode* reverseList(struct ListNode* head,struct ListNode *p){struct ListNode *pre = p;struct ListNode *curr = head;while(head!=p){struct ListNode *next = head->next;head->next = pre;pre = head;head = next;}return pre;
}/**
找到要反转链表的首节点以及最后一个节点的后一个节点。
*/
struct ListNode* reverseBetween(struct ListNode* head, int left, int right){struct ListNode *pre = NULL;//pre:要反转链表的前一个元素struct ListNode *curr = head;//curr:要反转链表的最后一个元素for(int i=1;i<left;i++){pre = curr;curr = curr->next; }for(int i=left;i<right;i++){curr = curr->next;}/*如果pre不等于NULL,说明pre的下一个节点是首节点,如果pre等于NULL,head就是要反转的首节点,反转链表最后一个节点的后一个节点是curr->next*/if(pre!=NULL){pre->next = reverseList(pre->next,curr->next);return head;}else{return reverseList(head,curr->next);}
}
合并两个有序链表
21. 合并两个有序链表
使用递归思路。
/*
函数返回值是两个链表按照递增合并后的链表
*/
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2){if(list1==NULL){return list2;}if(list2==NULL){return list1;}if(list1->val <list2->val){list1->next = mergeTwoLists(list1->next,list2);return list1;}else{list2->next = mergeTwoLists(list1,list2->next);return list2;}
}
删除重复元素
struct ListNode* deleteDuplicates(struct ListNode* head){if(head==NULL || head->next==NULL){return head;}//head = head->val==head->next->val?head->next:head;head->next = deleteDuplicates(head->next);return head->val==head->next->val?head->next:head;
}