单链表进行以下简单操作.
1头插
cur->next=head;
head=cur;
2.头删
tmp=head;
head=head->next;
free(tmp);
3.后插
cur->next=pos->next;
pos->next=cur;
4.后删
tmp=pos->next;
pos->next=tmp->next;
free(tmp);
5.反转链表
<1>
oldhead->next=tmp->next;
tmp->next=head;
head=tmp;
tmp=old->next;
<2>
next=next->next;
cur->next=prev;
pre=cur;
cur=next;
6.寻找入环节点
eg: 给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null
。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* hasCycle(struct ListNode *head)
{
struct ListNode* fast=head;
struct ListNode* slow=head;
if(head==NULL)
return head;
while(fast && fast->next)
{
slow=slow->next;
fast=fast->next->next;
if(slow==fast)
return slow;
}
return NULL;
}
struct ListNode *detectCycle(struct ListNode *head) {
if(head==NULL)
return head;
//找到相遇点
struct ListNode* head1,*slow1;
slow1=hasCycle(head);
head1=head;
if(slow1)
{
while(slow1 != head1)
{
slow1=slow1->next;
head1=head1->next;
}
return slow1;
}
return NULL;
}
7.单链表还有最重要的遍历.
之前我们一边在遍历时使用的是while循环,但是在单链表遍历时建议使用for循环,这样不用考虑循环结束的条件,下面这个可以作为公式记下.
for(cur=head ; cur ; cur=cur->next)
{
cur ; //cur可以完成一个遍历
}
有头双向循环链表简单操作
1.后插
pos->next=cur;
cur->prev=pos;
tmp->prev=cur;
cur->next=tmp;
2.删除自己
pos->next->prev=pos->prev;
pos->prev->next=pos->next;
free(pos);
3.遍历
for(cur=head->next; cur!=head cur=cur->next)
{
cur;//cur完成遍历
}