您的位置:首页 > 其它

单链表之单链表逆置

2015-10-19 12:50 260 查看
首先是使用三指针方法实现。
三指针就是使用三个指针分别记录操作每个结点的<<前驱结点>>,<<本身结点>>,<<后驱结点>>。
通过while循环不断的调整顺序,然后逐点后移进行操作。
使用头插法实现翻转
翻转链表(遍历)
从头到尾遍历原链表,每遍历一个结点,
将其摘下放在新链表的最前端。
注意链表为空和只有一个结点的情况。时间复杂度为O(n)

public static Node reverseList(Node head) {
// 如果链表为空或只有一个节点,无需反转,直接返回原链表表头
if (null == head || head.next == null)
return head;

// 反转后新链表头指针
// 初始为null
Node reHead = null;

// 当前处理节点
Node cur = head;

// 当前节点后移之前保存当前节点以防止丢失
Node pre = null;

while (cur != null) {

// 用pre保存对要处理节点的引用
pre = cur;

// cur更新到下一个节点
cur = cur.next;

// 更新要处理节点的next引用
pre.next = reHead;

// reHead指向要处理节点的前一个节点
reHead = pre;
}
return reHead;

}


单链表逆置的递归实现:

/**
* 翻转递归(递归) 递归的<<精髓>>在于你就默认reverseListRec已经<<成功帮你解决>>了子问题了!但别去想如何解决的
* 现在只要处理<<当前node>>和<<子问题>>之间的关系。最后就能圆满解决整个问题.
*/
public static Node reverseListRec(Node head) {
// 如果链表为空或只有一个节点,无需反转,直接返回原链表表头
// 第一个条件是判断异常,第二个条件是结束判断
if (null == head || null == head.next) {
return head;
}

Node reHead = reverseListRec(head.next);// 记录子序列的新的头结点
// 当前结点与已经逆置的子序列看成是前后的两个结点p,q,作相应的逆置操作
head.next.next = head; // 把head接在reHead串的最后一个后面
head.next = null; // 防止循环链表
return reHead;// 返回新的子序列的头结点
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: