您的位置:首页 > 职场人生

常见的单链表面试题

2016-05-20 12:48 399 查看
//单链表的逆置:

ListNode* Reverse(ListNode*head)
{
assert(head);
ListNode*cur = head;
ListNode*newhead = NULL;
while (cur)
{
ListNode*tmp = cur;
cur = cur->_next;
tmp->_next = newhead;
newhead = tmp;
}
return newhead;
}
//删除一个无头单链表的非尾节点
void Erase(ListNode*pos)
{
assert(pos);
assert(pos->_next);
ListNode*next = pos->_next;
pos->_data = next->_data;
pos->_next = next->_next;
free(next);
}
//在无头单链表的非头结点前插入一个节点
void Insert(ListNode*pos,Datatype x)
{
assert(pos);
ListNode*temp = BuyNode(pos->_data);
/*temp->_next = pos->_next;
pos->_next = temp;
pos->_data = x;*/
pos->_next = temp;
temp->_data = pos->_data;
pos->_data = x;
}
//判断单链表是否有环
int Isloop(ListNode*head)
{
if (head == NULL || head->_next == NULL)
{
return 1;
}
ListNode*p = head;
ListNode*q = head;
while (p->_next != NULL && q->_next->_next != NULL)
{
p = p->_next;
q = q->_next->_next;
if (p == q)
{
return 1;
}
}
return 0;
}
//判断两个单链表是否相交并返回交点,“Y”型相交
ListNode* Ismeet(ListNode*head1, ListNode*head2)
{
assert(head1&&head2);
int len1 = 0;
int len2 = 0;
ListNode*cur = head1;
ListNode*tmp = head2;
ListNode*fast = NULL;
ListNode*slow = NULL;
while (cur)
{
len1++;
cur=cur->_next;
}
while (tmp)
{
len2++;
tmp=tmp->_next;
}
if (cur == tmp)
{
return cur;
}
else
{
return NULL;
}
int steps = abs(len1 - len2);
if (len1 > len2)
{
fast= head1;
slow = head2;
}
else
{
fast = head2;
slow = head1;
}
while (steps)
{
fast=fast->_next;
steps--;
}
while (fast!=slow)
{
fast=fast->_next;
slow=slow->_next;
}
return fast;
}
//从尾到头输出单链表
void TailtoHead(ListNode*head)
{
assert(head);
TailtoHead(head->_next);
printf("%d", head->_data);
}
//单链表排序(冒泡排序法)
void SortList(ListNode*head)
{
assert(head);
ListNode*cur = head;
ListNode*next = head->_next;
int len = 0;
while (cur)
{
len++;
cur = cur->_next;
}
for (int i = 1; i < len-1; i++)
{
for (int j = 0; j < len-i; j++)
{
if (cur->_data>next->_data)
{
int tmp = cur->_data;
cur->_data = next->_data;
next->_data = tmp;
}
}
}
}
//合并两个有序链表,合并后依然有序
//递归法
ListNode* MergeList(ListNode*list1, ListNode*list2)
{
ListNode*merge = NULL;
if (list1 == NULL&&list2 == NULL)
return NULL;
if (list1 == NULL&&list2 != NULL)
return list2;
if (list1 != NULL&&list2 == NULL)
return list1;
if (list1->_data <list2->_data)
{
merge = list1;
merge->_next = MergeList(list1->_next, list2);
}
else
{
merge = list2;
merge->_next = MergeList(list1, list2->_next);
}
return merge;
}
//循环法:
ListNode* XMergeList(ListNode*head1, ListNode*head2)
{
ListNode*merge = NULL;
if (head1 == NULL&&head2 == NULL)
return NULL;
if (head1 == NULL&&head2 != NULL)
return head2;
if (head1 != NULL&&head2 == NULL)
return head1;
if (head1->_data < head2->_data)
{
merge = head1;
head1 = head1->_next;
}
else
{
merge = head2;
head2 = head2->_next;
}
ListNode*Pflag = merge;
while (head1 != NULL&&head2 != NULL)
{
if (head1->_data < head2->_data)
{
Pflag->_next= head1;
Pflag = head1;
head1 = head1->_next;
}
else
{
Pflag->_next = head2;
Pflag = head2;
head2 = head2->_next;
}
}
if (head1 == NULL)
{
Pflag->_next = head2;
}
else
{
Pflag->_next = head1;
}
return merge;
}
//求链表的倒数第k个节点
ListNode*Find_k(ListNode*head,int k)
{
assert(head);
ListNode*cur = head;
ListNode*fast = head;
ListNode*slow = head;
int count = 1;
while (cur)
{
cur = cur->_next;
count++;
}
if (k > count || k < 0)
{
printf("所取位置不合法!");
}
else
{
while (k)
{
fast = fast->_next;
}
while (fast)
{
fast = fast->_next;
slow = slow->_next;
}
return slow;
}
}
//找出链表的中间元素
ListNode*FindMid(ListNode*head)
{
assert(head);
ListNode*fast = head;
ListNode*slow = head;
while (fast&&fast->_next)
{
fast = fast->_next->_next;
slow = slow->_next;
}
return slow;
}

本文出自 “溪风” 博客,请务必保留此出处http://xiexiankun.blog.51cto.com/10785425/1775363
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: