反转链表
反转链表包括两种,反转全部元素或者反转部分元素。在这里,我们约定:数据元素类型是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;
}