給一個帶頭節點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();
}