单链表反转singlelist reverse
2014-08-12 17:21
190 查看
单链表反转的方法可以分为非递归和递归两类。
非递归的方法比较常见,如:
方法1:将单链表储存为数组,然后按照数组的索引逆序进行反转。
方法2:使用三个指针遍历单链表,逐个链接点进行反转。
方法3:从第2个节点到第N个节点,依次逐节点插入到第1个节点(head节点)之后,最后将第一个节点挪到新表的表尾。
方法1的问题是浪费空间。方法2和方法3效率相当。一般方法2较为常用。
方法2代码:
[cpp]
view plaincopyprint?
Node * ReverseList(Node *head)
{
Node *p1,*p2,*p3;
if(head==NULL||*head==NULL)
return head;
p1=head;
p2=p1->next;
while(p2) //注意条件
{
p3=p2->next; //要改变p2->next的指针,所以必须先保留p2->next
p2->next=p1;
p1=p2; //循环往后
p2=p3;
}
head->next=NULL; //原先的head已经变成tail,别忘了置空,只有到这步才能置空
*head=p1;
return head;
}
方法3代码:
[cpp]
view plaincopyprint?
Node* ReverseList(Node* head)
{
Node *p,*q;
p=head->next;
while(p->next!=NULL) //在这个循环过程中p所指的元素一直是不变的
{
q=p->next;
p->next=q->next;
q->next=head->next;
head->next=q;
}
p->next=head; //相当于成环
head=p->next->next; //新head变为原head的next
p->next->next=NULL; //断掉环
return head;
}
递归的方法如下:
ReverseSingleLink.java
public class ReverseSingleLink {
public static Node revSingleLink(Nodehead){
if(head == null){ //链表为空不能逆序
return head;
}
if(head.getNextNode()==null){ //如果只有一个结点,当然逆过来也是同一个
return head;
}
Node rhead =revSingleLink(head.getNextNode());
head.getNextNode().setNextNode(head);
head.setNextNode(null);
return rhead;
}
public static void main(String[] args){
Node head = new Node(0);
Node temp1 = null,temp2 = null;
for(int i=1;i<100;i++){
temp1 = new Node(i);
if(i==1){
head.setNextNode(temp1);
}else{
temp2.setNextNode(temp1);
}
temp2= temp1;
}
head = revSingleLink(head);
while(head!=null){
head = head.getNextNode();
}
}
非递归的方法比较常见,如:
方法1:将单链表储存为数组,然后按照数组的索引逆序进行反转。
方法2:使用三个指针遍历单链表,逐个链接点进行反转。
方法3:从第2个节点到第N个节点,依次逐节点插入到第1个节点(head节点)之后,最后将第一个节点挪到新表的表尾。
方法1的问题是浪费空间。方法2和方法3效率相当。一般方法2较为常用。
方法2代码:
[cpp]
view plaincopyprint?
Node * ReverseList(Node *head)
{
Node *p1,*p2,*p3;
if(head==NULL||*head==NULL)
return head;
p1=head;
p2=p1->next;
while(p2) //注意条件
{
p3=p2->next; //要改变p2->next的指针,所以必须先保留p2->next
p2->next=p1;
p1=p2; //循环往后
p2=p3;
}
head->next=NULL; //原先的head已经变成tail,别忘了置空,只有到这步才能置空
*head=p1;
return head;
}
Node * ReverseList(Node *head) { Node *p1,*p2,*p3; if(head==NULL||*head==NULL) return head; p1=head; p2=p1->next; while(p2) //注意条件 { p3=p2->next; //要改变p2->next的指针,所以必须先保留p2->next p2->next=p1; p1=p2; //循环往后 p2=p3; } head->next=NULL; //原先的head已经变成tail,别忘了置空,只有到这步才能置空 *head=p1; return head; }
方法3代码:
[cpp]
view plaincopyprint?
Node* ReverseList(Node* head)
{
Node *p,*q;
p=head->next;
while(p->next!=NULL) //在这个循环过程中p所指的元素一直是不变的
{
q=p->next;
p->next=q->next;
q->next=head->next;
head->next=q;
}
p->next=head; //相当于成环
head=p->next->next; //新head变为原head的next
p->next->next=NULL; //断掉环
return head;
}
递归的方法如下:
ReverseSingleLink.java
public class ReverseSingleLink {
public static Node revSingleLink(Nodehead){
if(head == null){ //链表为空不能逆序
return head;
}
if(head.getNextNode()==null){ //如果只有一个结点,当然逆过来也是同一个
return head;
}
Node rhead =revSingleLink(head.getNextNode());
head.getNextNode().setNextNode(head);
head.setNextNode(null);
return rhead;
}
public static void main(String[] args){
Node head = new Node(0);
Node temp1 = null,temp2 = null;
for(int i=1;i<100;i++){
temp1 = new Node(i);
if(i==1){
head.setNextNode(temp1);
}else{
temp2.setNextNode(temp1);
}
temp2= temp1;
}
head = revSingleLink(head);
while(head!=null){
head = head.getNextNode();
}
}
相关文章推荐
- LeetCode-92-Reverse Linked List II 链表反转 各种边界条件
- 剑指offer 面试题16:反转链表(Leetcode 206: Reverse Linked List) 题解
- 链表的反转问题(Reverse Linked List)
- Reverse Linked List(反转链表)
- 反转单向链表(reverse a singly linked list)(单个反转) [# 7]
- 两两反转单向链表 (reverse a singly linked list in pair ) [#22]
- LeetCode中几道链表反转相关题目(Reorder List、Rotate List、Reverse Nodes in k-Group)
- 206. Reverse Linked List&反转链表
- Leetcode Reverse Linked List 反转单链表
- 面试之路(28)-反转链表(reverse ListNode)
- 反转单向链表(reverse a singly linked list)
- LeetCode 25 Reverse Nodes in k-Group(在K组链表中反转结点)(Linked List)(*)
- 面试之路(28)-反转链表(reverse ListNode)
- LeetCode206——Reverse Linked List 反转链表
- [LeetCode] Reverse Linked List(递归与非递归反转链表)
- 面试之路(28)-反转链表(reverse ListNode)
- (Leetcode)92. Reverse Linked List II ——反转单链表
- C实现 LeetCode->Reverse Linked List II (双指针大法)(单链表反转)
- LeetCode OJ:Reverse Linked List II(反转链表II)
- 19.递归法和非递归法反转链表[ReverseLinkedList]