逆置單鏈表的部分區間---【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();
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章