搜狐2013届校园招聘笔试题目是:分别用迭代和递归的方法对单链表进行逆转。听今天去华为参加机试的同学说,三道机试题目中也有一道同样的题目。由是自己动手写了写,代码如下:
typedef struct LinkNode
{
ElementType data;
struct LinkNode *next;
} node;
代码1:迭代方法
node* rLink(node *head)
{
if(head == NULL || head->next == NULL)
return head;
node *p1 = head;
node *p2 = p1->next;
node *p3 = p2->next;
p1->next = NULL;
while(p3 != NULL)
{
p2->next = p1;
p1 = p2;
p2 = p3;
p3 = p3->next;
}
p2->next = p1;
head = p2;return head;
}代码2:递归方法
p1 和p2指针分别指向当前递归子链表list1的第一个和第二结点。然后对以p2为首结点的子链表list2进行递归逆转;则p2节点将成为list2r逆转后的尾结点,而此时函数返回的头结点将是原list2的尾结点(如下图)。最后我们只要把p2的next指向p1就OK了。
node* recursive_Link(node* head)
{
if(head == NULL || head->next == NULL)
return head;
node* p1 = head;
node* p2 = p1->next; //p2其实记录的下一步递归过程后的尾结点
head = recursive_Link(p2);
p2->next = p1;
p1->next = NULL;return head;
}