算法题小试牛刀

算法题小试牛刀 Day1之链表反转(无头结点)

题目介绍

给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。

解析

本题中,链表没有头节点,可以采用堆栈或者头插法建立反转链表.

  1. 第一种方法----头插法
    将现在的头节点pHead当作新链表的最后一个节点,遍历余下的链表,将每个头节点插入到pHead的前面,直到剩余链表为空,则反转链表创建完成
  2. 第二种方法----堆栈
    将链表的每个节点破坏链接关系,作为一个个节点装入stack中,之后stack退栈,完成链表的倒置。
  3. 递归
    实际并没有反转,只是通过倒序的输出实现表面的反转。

代码

#include
#include
using namespace std; 
struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) {
	}
};
class Solution {
public:
    ListNode* ReverseList(ListNode* pHead) {
		if(pHead==nullptr)
			return pHead;
		ListNode *q,*p;
		p = pHead->next;
		pHead->next = nullptr;
		while(p!=nullptr)
		{
			q = p->next;
			p->next = pHead;
			pHead = p;
			p = q;
		}
		return pHead;
    }
};
int main()
{
	ListNode *head = new ListNode(1);
	head->next = new ListNode(2);
	head->next->next = new ListNode(3);

	Solution s;
	head = s.ReverseList(head);
	while(head!=nullptr)
	{
		cout<val;
		head=head->next;
	}
	return 0;
}
#include
#include
using namespace std; 
struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) {
	}
};
class Solution {
public:
    stack s;
ListNode* ReverseList(ListNode* pHead)
{
	if(pHead==nullptr)
		return pHead;
	while(pHead!=nullptr)
	{
		ListNode *temp = new ListNode(pHead->val);
		s.emplace(temp);
		pHead = pHead->next;
	}
	ListNode *head = s.top();
	s.pop();
	ListNode *result = head;
	while(!s.empty())
	{
		head->next = s.top();
		s.pop();
		head = head->next;
	}
	return result;
}
};
int main()
{
	ListNode *head = new ListNode(1);
	head->next = new ListNode(2);
	head->next->next = new ListNode(3);

	Solution s;
	head = s.ReverseList(head);
	while(head!=nullptr)
	{
		cout<val;
		head=head->next;
	}
	return 0;
}
void ReverseList(ListNode* pHead)
{
	if(pHead==nullptr)
		return ;
	else
	{
		ReverseList(pHead->next);
		cout<val;
	}
}

注:

在写代码时要注意c++中指针导致的各种问题,如果实在不想考虑,可以采取第二种方法,将链表分为一个个节点,之后重新链接,简单粗暴。

你可能感兴趣的:(算法,链表,数据结构)