逆置单链表的部分区间---【VIPKID面试题】

给一个带头节点head的单链表,给定start和end两个位置,将这个区间内置。。。

  • 思路:就是链表的逆置;先将区间内的逆置,再处理start和end的位置
  • 两种情况:
  • start是头结点时,要将链表的头结点head更新为end;
  • start不是头结点是正常处理;

(还是自己太菜了。。。。面试的时候先去处理start和endl了,导致后面没有处理好,,凉凉啊~~)

不说了,贴上代码:

void List::Reverse(Node* start, Node* end, Node* Head)
{
	if (Head == NULL || start == NULL || end == NULL)
	{
		cout << "非法逆置" << endl;
		return;
	}
	Node* prev = NULL;
	Node* cur = Head;
	Node* end_next = end->next;
	Node* tmp = NULL;

	//先将start和end之间逆置,然后在特殊处理start和end节点,
	
	while (cur != start)//找到start的前一个节点prev
	{
		prev = cur;
		cur = cur->next;
	}
	while (cur != end)
	{
		tmp = cur->next;
		cur->next = prev;
		prev = cur;
		cur = tmp;
	}
	cur->next = prev;
	//处理start和end
	if (start->next == NULL)//如果start是头结点,就把end边城head
	{
		head = end;
		start->next = end_next;

	}
	else
	{
		prev = start->next;
		start->next = end_next;
		prev->next = end;
	}
}

很简答对吧!!
下面是整个链表的实现代码(供大家测试):


#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;

typedef struct ListNode
{
	int value;
	ListNode* next;
	ListNode(int a)
	{
		value = a;
		next = NULL;
	}
}Node;


class List
{
public:

	List()
	{
		head = NULL;
		tail = NULL;
	}

	~List()
	{
		Node* cur = head;
		while (cur)
		{
			head = cur->next;
			delete cur;
			cur = NULL;
			cur = head;
		}
		head = NULL;
	}
	void Push(int data);
	Node* Find(int data);
	void Reverse(Node* start, Node* end, Node* Head = head);
	void Print();
private:
	static Node* head;
	static Node* tail;
};


Node* List::head = NULL;
Node* List::tail = NULL;

void List:: Push(int data)
{
	Node* newnode = new Node(data);
	if (head == NULL)
	{
		head = newnode;
		tail = head;
	}
	else
	{
		//尾插
		tail->next = newnode;
		tail = tail->next;
	}
}

Node* List::Find(int data)
{
	if (head == NULL)
		return NULL;
	Node* cur = head;
	while (cur)
	{
		if (cur->value == data)
			return cur;
		else
			cur = cur->next;
	}
	return NULL;
}

void List::Reverse(Node* start, Node* end, Node* Head)
{
	if (Head == NULL || start == NULL || end == NULL)
	{
		cout << "非法逆置" << endl;
		return;
	}
	Node* prev = NULL;
	Node* cur = Head;
	Node* end_next = end->next;
	Node* tmp = NULL;

	//先将start和end之间逆置,然后在特殊处理start和end节点,
	
	while (cur != start)//找到start的前一个节点prev
	{
		prev = cur;
		cur = cur->next;
	}
	while (cur != end)
	{
		tmp = cur->next;
		cur->next = prev;
		prev = cur;
		cur = tmp;
	}
	cur->next = prev;
	//处理start和end
	if (start->next == NULL)//如果start是头结点,就把end边城head
	{
		head = end;
		start->next = end_next;

	}
	else
	{
		prev = start->next;
		start->next = end_next;
		prev->next = end;
	}
}

void List::Print()
{
	Node*cur = head;
	while (cur)
	{
		cout << cur->value << "->";
		cur = cur->next;
	}
	cout << endl;
}


void test()
{
	List l;
	l.Push(1);
	l.Push(2);
	l.Push(3);
	l.Push(4);
	l.Push(5);
	l.Push(6);
	l.Print();
	l.Reverse(l.Find(1), l.Find(6));
	l.Print();
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章