反转链表

时间:2013-11-17 09:59:37

标签: java linked-list

我的问题是:给定一个反转链表的功能。

我在C中的尝试是:

ListNode *reverse(ListNode *head)
{
    if(head == NULL || head->next == NULL)
        return head;

    ListNode *temp = head->next;
    ListNode *retP =  reverse(temp);
    temp->next = head;
    head->next = NULL;
    return retP;
}

但我不认为这是对的。我希望能够用Java做到这一点,我对此感到难过。任何帮助,将不胜感激。请帮助我开始

3 个答案:

答案 0 :(得分:3)

如果要在Java中反转List,请使用

Collections.reverse(List list)

如果您想知道如何实施或想要手动执行,请查看the JDK sources of java.util.Collections

答案 1 :(得分:0)

迭代

public reverseListIteratively (Node head) {
if (head == NULL || head.next == NULL)
return;  //empty or just one node in list

Node Second = head.next;

//store third node before we change 
Node Third = Second.next;  

//Second's next pointer
Second.next = head;  //second now points to head
head.next = NULL;  //change head pointer to NULL

//only two nodes, which we already reversed
if (Third == NULL)
return;  

Node CurrentNode = Third;

Node PreviousNode = Second;

while (CurrentNode != NULL)
{ 
Node NextNode = CurrentNode.next;

CurrentNode.next = PreviousNode;

/*  repeat the process, but have to reset
     the PreviousNode and CurrentNode
*/

PreviousNode = CurrentNode;
CurrentNode = NextNode;  
}

head  = PreviousNode; //reset the head node
}

递归

public void recursiveReverse(Node currentNode )
{  
 //check for empty list 
 if(currentNode == NULL)
    return;

/* if we are at the TAIL node:
    recursive base case:
 */
if(currentNode.next == NULL) 
{ 
//set HEAD to current TAIL since we are reversing list
head = currentNode; 
return; //since this is the base case
}

recursiveReverse(currentNode.next);
currentNode.next.next = currentNode;
currentNode.next = null; //set "old" next pointer to NULL
}

来源,有解释(使用谷歌3秒后)http://www.programmerinterview.com/index.php/data-structures/reverse-a-linked-list/

答案 2 :(得分:0)

public Node reverse(Node node){
    Node p=null, c=node, n=node;
    while(c!=null){
        n=c.next;
        c.next=p;
        p=c;
        c=n;
    }
return p;
}