链表反转问题,例如问题 1->2->3->4 反转 4->3->2->1
定义节点类
#define ListNodePosi(T) ListNode<T>* //链表节点位置
template<typename T> struct Node //为了简便完全开放而不过度封装
{
T data; //数据
ListNodePosi(T) pred; //前驱
ListNodePosi(T) succ; //后继
Node() {}; //针对header 和traailer的构造
Node next;
Node(T e, ListNodePosi(T) p = NULL, ListNodePosi(T) s = NULL)
:data(e), pred(p), succ(s) {} //默认构造函数
ListNodePosi(T) insertAsPred(T const& e); //前插入
ListNodePosi(T) insertAsSucc(T const& e); //后插入
};
以迭代方式实现
static Node reverseList(Node head) //反转链表
{
Node pre = NULL; //定义前驱
Node succ = NULL; //定义后继
while (head != NULL) //如果存在结点
{
succ = head.next; //指向当前节点的后继
head.next = pre; //令当前节点的后继指向前驱
pre = head; // 处理下一个节点
head = succ;
}
return pre;
}
以递归的方式实现
static Node reverseList2(Node head) //反转链表
{
if (head == NULL || head.next == NULL) return head;
else
{
Node new=reverseList2(head.next); //递归反转子链表
Node N = head.next; //反转平凡问题的链表指向
N.next = head;
head.next = NULL;
return new; //返回调整后的链表
}
}
做个小小的记录 有助于复习